From d4191b4daf5e939f4ccc08338cc2855153e7d5ab Mon Sep 17 00:00:00 2001 From: hkc320 Date: Thu, 12 Sep 2024 16:23:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=A1=A8tableview?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- applications/emsConfigurer/datafetcher.cpp | 22 +++ applications/emsConfigurer/datafetcher.h | 19 +++ .../emsConfigurer/devicepropertypage.cpp | 125 ++++++++++++++++ .../emsConfigurer/devicepropertypage.h | 51 +++++++ applications/emsConfigurer/emsConfigurer.pro | 13 +- .../emsConfigurer/globalparameters.cpp | 96 ++++++++++++ applications/emsConfigurer/globalparameters.h | 78 ++++++++++ applications/emsConfigurer/main.cpp | 1 + applications/emsConfigurer/maindialog.cpp | 41 ++--- applications/emsConfigurer/maindialog.h | 6 +- applications/emsConfigurer/mainwindow.cpp | 2 + applications/emsConfigurer/mytablemodel.cpp | 140 ++++++++++++++++++ applications/emsConfigurer/mytablemodel.h | 37 +++++ applications/emsConfigurer/singleton.h | 24 +++ 14 files changed, 624 insertions(+), 31 deletions(-) create mode 100644 applications/emsConfigurer/datafetcher.cpp create mode 100644 applications/emsConfigurer/datafetcher.h create mode 100644 applications/emsConfigurer/devicepropertypage.cpp create mode 100644 applications/emsConfigurer/devicepropertypage.h create mode 100644 applications/emsConfigurer/globalparameters.cpp create mode 100644 applications/emsConfigurer/globalparameters.h create mode 100644 applications/emsConfigurer/mytablemodel.cpp create mode 100644 applications/emsConfigurer/mytablemodel.h create mode 100644 applications/emsConfigurer/singleton.h diff --git a/applications/emsConfigurer/datafetcher.cpp b/applications/emsConfigurer/datafetcher.cpp new file mode 100644 index 0000000..4be0b91 --- /dev/null +++ b/applications/emsConfigurer/datafetcher.cpp @@ -0,0 +1,22 @@ +#include "datafetcher.h" +#include "globalparameters.h" + +DataFetcher::DataFetcher() +{ + +} + +DataFetcher::~DataFetcher() +{ + +} + +bool DataFetcher::Fetch(TableData& tbl_data) +{ + return true; +} + +int DataFetcher::VerifyStatus() +{ + return STATUS_NORMAL; +} diff --git a/applications/emsConfigurer/datafetcher.h b/applications/emsConfigurer/datafetcher.h new file mode 100644 index 0000000..35a07f4 --- /dev/null +++ b/applications/emsConfigurer/datafetcher.h @@ -0,0 +1,19 @@ +#ifndef DATAFETCHER_H +#define DATAFETCHER_H + +#include "globalparameters.h" + +class DataFetcher +{ +public: + DataFetcher(); + virtual ~DataFetcher(); + +public: + virtual bool Fetch(TableData& tbl_data); + +protected: + int VerifyStatus(); +}; + +#endif // DATAFETCHER_H diff --git a/applications/emsConfigurer/devicepropertypage.cpp b/applications/emsConfigurer/devicepropertypage.cpp new file mode 100644 index 0000000..f64d1dc --- /dev/null +++ b/applications/emsConfigurer/devicepropertypage.cpp @@ -0,0 +1,125 @@ +#include "devicepropertypage.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "globalparameters.h" +#include "mytablemodel.h" + +DevicePropertyPage::DevicePropertyPage(QWidget *parent) : + QWidget(parent),m_pTableView(nullptr),m_pButton(nullptr) +{ + //InitializeTable(); + + m_pTimer = new QTimer(this); + connect(m_pTimer, SIGNAL(timeout()), this, SLOT(handleTimeout())); + //m_pTimer->start(AppData::getInstance()->nTimeOut); + + } + +DevicePropertyPage::~DevicePropertyPage() +{ +} + +void DevicePropertyPage::handleTimeout() +{ + if(m_pTimer->isActive()) + { + m_pTimer->stop(); + + Refresh(); + + int nInterval = 5000; //ui->spinBox->value(); + m_pTimer->start(nInterval*1000); + } +} + +void DevicePropertyPage::InitializeTable() +{ + m_myModel = new MyTableModel(this); + m_myModel->setHeadData(AppData::getInstance()->lstDataTableHeaderText); + + m_pTableView = new QTableView(this); + m_pButton = new QPushButton(tr("Refresh"), this); + + // 创建主布局 + QVBoxLayout *mainLayout = new QVBoxLayout(this); + + //AppCommon::getInstance()->InitializeTableView(m_myModel,m_pTableView); + m_pTableView->setModel(m_myModel); + // 自动调整列宽 + connect(m_pTableView->horizontalScrollBar(), &QScrollBar::valueChanged, this, &DevicePropertyPage::adjustColumnWidths); + adjustColumnWidths(); // 初次设置列宽 + + mainLayout->addWidget(m_pTableView); + + // 创建一个水平布局来包含按钮 + QHBoxLayout *buttonLayout = new QHBoxLayout(); + buttonLayout->addStretch(); // 让按钮保持在右侧 + buttonLayout->addWidget(m_pButton); + buttonLayout->setContentsMargins(0, 0, 0, 0); // 取消按钮的边距 + + // 将表格视图和按钮布局添加到主布局 + mainLayout->addLayout(buttonLayout); + + mainLayout->setContentsMargins(0, 0, 0, 0); // 取消主布局的边距 + mainLayout->setSpacing(10); // 取消布局间的间距 + + // 设置固定大小和位置的按钮 + m_pButton->setFixedSize(100, 30); // 设置按钮的固定大小 + + // 连接信号和槽 + connect(m_pTableView, &QTableView::doubleClicked, this, &DevicePropertyPage::onTableViewDoubleClicked); + connect(m_pButton, &QPushButton::clicked, this, &DevicePropertyPage::onButtonClicked); +} + +void DevicePropertyPage::Refresh() +{ + QGuiApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); + TableData tbl_data; + if (Fetch(tbl_data)) + { + m_myModel->setModelData(tbl_data); + } + QGuiApplication::restoreOverrideCursor(); +} + +void DevicePropertyPage::setBaseType(unsigned int base, unsigned int mask) +{ + filterBaseType = base; + mask_code = mask; +} + + +void DevicePropertyPage::onButtonClicked() +{ + m_pTimer->stop(); + + Refresh(); +} + + +void DevicePropertyPage::onTableViewDoubleClicked(const QModelIndex &index) +{ + //QAbstractItemModel *model=ui->tableView->model(); + MyTableModel *model = (MyTableModel *)m_pTableView->model(); + QModelIndex mindex = model->index(index.row(),7); //index.row()为算选择的行号。7为所选中行的第8列。。 + QVariant datatemp=model->data(mindex); +} + +void DevicePropertyPage::adjustColumnWidths() +{ + int columnCount = m_pTableView->model()->columnCount(); + int totalWidth = m_pTableView->viewport()->width(); + int columnWidth = totalWidth / columnCount; + for (int column = 0; column < columnCount; ++column) + { + m_pTableView->setColumnWidth(column, columnWidth); + } +} + diff --git a/applications/emsConfigurer/devicepropertypage.h b/applications/emsConfigurer/devicepropertypage.h new file mode 100644 index 0000000..2861a3a --- /dev/null +++ b/applications/emsConfigurer/devicepropertypage.h @@ -0,0 +1,51 @@ +#ifndef DEVICEPROPERTYPAGE_H +#define DEVICEPROPERTYPAGE_H + +#pragma execution_character_set("utf-8") + +#include +#include "datafetcher.h" + +class MyTableModel; +class QTimer; +class QTableView; +class QPushButton; + +class DevicePropertyPage : public QWidget,public DataFetcher +{ + Q_OBJECT + +public: + explicit DevicePropertyPage(QWidget *parent = nullptr); + ~DevicePropertyPage(); + void setBaseType(unsigned int base,unsigned int mask); + void InitializeTable(); + +public slots: + void handleTimeout(); //超时处理函数 + +private: + QTimer *m_pTimer; + +private: + MyTableModel* m_myModel; + +protected: + + void Refresh(); + +private slots: + void onButtonClicked(); + + void onTableViewDoubleClicked(const QModelIndex &index); + + void adjustColumnWidths(); + +private: + unsigned int filterBaseType; + unsigned int mask_code; + QTableView* m_pTableView; + QPushButton* m_pButton; +}; + +#endif // DEVICEPROPERTYPAGE_H diff --git a/applications/emsConfigurer/emsConfigurer.pro b/applications/emsConfigurer/emsConfigurer.pro index 8db1d60..103d31c 100644 --- a/applications/emsConfigurer/emsConfigurer.pro +++ b/applications/emsConfigurer/emsConfigurer.pro @@ -39,13 +39,22 @@ win32:LIBS += Ws2_32.lib #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ + datafetcher.cpp \ + devicepropertypage.cpp \ + globalparameters.cpp \ main.cpp \ maindialog.cpp \ - mainwindow.cpp + mainwindow.cpp \ + mytablemodel.cpp HEADERS += \ + datafetcher.h \ + devicepropertypage.h \ + globalparameters.h \ maindialog.h \ - mainwindow.h + mainwindow.h \ + mytablemodel.h \ + singleton.h FORMS += \ maindialog.ui \ diff --git a/applications/emsConfigurer/globalparameters.cpp b/applications/emsConfigurer/globalparameters.cpp new file mode 100644 index 0000000..4c41478 --- /dev/null +++ b/applications/emsConfigurer/globalparameters.cpp @@ -0,0 +1,96 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "globalparameters.h" +#include "mytablemodel.h" + +AppData::~AppData() +{ +} + +AppData::AppData(token) +{ + lstDataTableHeaderText << ("Status") + << ("Parameter") + << ("Value") + << ("Unit") + << ("Time"); + + nTimeOut = 5000; + qsDestinationIp = "127.0.0.1"; + + qsLastErrorString = "OK"; + +} + +AppCommon::AppCommon(token) +{ +} + +AppCommon::~AppCommon() +{ + +} + +void AppCommon::InitializeTableView(MyTableModel *model, QTableView *tableView) +{ + //设置tableview的model + model->setHeadData(AppData::getInstance()->lstDataTableHeaderText); + tableView->setModel(model); + + //tableView->horizontalHeader()->setStyleSheet("QHeaderView::section {color: black;padding-left: 4px;border: 1px solid #6c6c6c;}"); + tableView->horizontalHeader()->setStyleSheet("QHeaderView::section{background:lightgray;}"); + //tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive); //Stretch + + //点击表时不对表头行光亮(获取焦点) + tableView->horizontalHeader()->setHighlightSections(false); + + tableView->horizontalHeader()->setDefaultSectionSize(35); + tableView->verticalHeader()->setDefaultSectionSize(30); //行高 + + tableView->setSelectionBehavior(QAbstractItemView::SelectRows); + tableView->setSelectionMode(QAbstractItemView::SingleSelection); + + tableView->setAlternatingRowColors(true); + tableView->setTextElideMode(Qt::ElideMiddle); + +// //设置表头字体加粗 +// QFont font = tableView->horizontalHeader()->font(); +// font.setBold(true); +// tableView->horizontalHeader()->setFont(font); + + //设置表头字体 + tableView->horizontalHeader()->setFont(QFont("Arial", 12)); + //所有单元格的字体 设置成一样 + tableView->setFont(QFont("Arial", 9)); + + //设置表格数据区内的所有单元格都不允许编辑 + tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); + + //设置列宽 + int w = tableView->width(); + int base = w /(AppData::getInstance()->lstDataTableHeaderText.count()-1); + tableView->setColumnWidth(0,base-45); + tableView->setColumnWidth(1,base-20); + tableView->setColumnWidth(2,base+30); + tableView->setColumnWidth(3,base+10); + tableView->setColumnWidth(4,base); + + tableView->show(); +} + +CWaitorCursor::CWaitorCursor() +{ + QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); +} + +CWaitorCursor::~CWaitorCursor() +{ + QApplication::restoreOverrideCursor(); +} diff --git a/applications/emsConfigurer/globalparameters.h b/applications/emsConfigurer/globalparameters.h new file mode 100644 index 0000000..b28dd6f --- /dev/null +++ b/applications/emsConfigurer/globalparameters.h @@ -0,0 +1,78 @@ +#ifndef GLOBALPARAMETERS_H +#define GLOBALPARAMETERS_H +#pragma execution_character_set("utf-8") + +#include + +#include "singleton.h" + +class QAbstractTableModel; +class QTableView; +class MyTableModel; + +//采集设备参数所处的状态 +typedef enum _tagSignalStatus +{ + STATUS_NORMAL = 0, + STATUS_WARN = 1, + STATUS_ERROR = 2, + STATUS_INFO = 3, +}SignalStatus; + +typedef struct _ModelItem +{ + SignalStatus status; + std::string ParameterName; + std::string value; + std::string unit; + std::string sampleTime; +}ModelItem; + +typedef QList TableData; + +class CWaitorCursor +{ +public: + CWaitorCursor(); + ~CWaitorCursor(); +}; + +//全局变量 +class AppData:public Singleton +{ +public: + AppData(token); + ~AppData(); + AppData(const AppData &other) = delete; + AppData& operator=(const AppData &other) = delete; + +public: + //数据表格的表头 + QStringList lstDataTableHeaderText; + + //定时刷新间隔 + int nTimeOut; + + //目标机器IP + QString qsDestinationIp; + + //最后的错误信息 + QString qsLastErrorString; +}; + + +//全局通用类 +class AppCommon:public Singleton +{ +public: + AppCommon(token); + ~AppCommon(); + + AppCommon(const AppCommon&)=delete; + AppCommon& operator =(const AppCommon&)= delete; + +public: + void InitializeTableView(MyTableModel* model,QTableView* tableView); +}; + +#endif // GLOBALPARAMETERS_H diff --git a/applications/emsConfigurer/main.cpp b/applications/emsConfigurer/main.cpp index 9e33498..f05625d 100644 --- a/applications/emsConfigurer/main.cpp +++ b/applications/emsConfigurer/main.cpp @@ -66,6 +66,7 @@ int main(int argc, char *argv[]) w.move((scr_w - w.width()) / 2, (scr_h - w.height()) / 2); w.show(); + int ret = app.exec(); hlogi("=========--- I'll be back! ---========="); return ret; diff --git a/applications/emsConfigurer/maindialog.cpp b/applications/emsConfigurer/maindialog.cpp index 11ce118..c57a2f1 100644 --- a/applications/emsConfigurer/maindialog.cpp +++ b/applications/emsConfigurer/maindialog.cpp @@ -14,6 +14,8 @@ #include #include +#include "devicepropertypage.h" + MainDialog::MainDialog(QWidget *parent) : QMainWindow (parent), ui(new Ui::MainDialog) @@ -22,12 +24,12 @@ MainDialog::MainDialog(QWidget *parent) : this->setWindowIcon(QIcon(":/images/icon.png")); - InitializeUI(); + //InitializeUI(); - connect(m_pDeviceListWidget, &QListWidget::currentItemChanged, this, &MainDialog::changePage); + // // Load the window state - loadWindowState(); + //loadWindowState(); } MainDialog::~MainDialog() @@ -96,6 +98,8 @@ void MainDialog::InitializeUI() //resize(800, 600); setMinimumSize(1024, 768); + + connect(m_pDeviceListWidget, &QListWidget::currentItemChanged, this, &MainDialog::changePage); } @@ -126,39 +130,22 @@ void MainDialog::CreateTablePage() { m_pDevicestackedWidget = new QStackedWidget(this); - QVBoxLayout *stackedWidgetLayout = new QVBoxLayout; + QVBoxLayout *stackedWidgetLayout = new QVBoxLayout(); m_pDevicestackedWidget->setLayout(stackedWidgetLayout); - // Create and set up QTableView - QTableView *tableView = new QTableView(this); + DevicePropertyPage *page1 = new DevicePropertyPage(m_pDevicestackedWidget); + DevicePropertyPage *page2 = new DevicePropertyPage(m_pDevicestackedWidget); - // Create and set up a model for the table view - QStandardItemModel *model = new QStandardItemModel(4, 3, this); // 4 rows, 3 columns - model->setHorizontalHeaderLabels(QStringList() << "Column 1" << "Column 2" << "Column 3"); + m_pDevicestackedWidget->addWidget(page1); // Add QTableView as a page + m_pDevicestackedWidget->addWidget(page2); - // Fill the model with data - for (int row = 0; row < 4; ++row) - { - for (int col = 0; col < 3; ++col) - { - QStandardItem *item = new QStandardItem(QString("Item %1-%2").arg(row).arg(col)); - model->setItem(row, col, item); - } - } - - tableView->setModel(model); - - m_pDevicestackedWidget->addWidget(tableView); // Add QTableView as a page - - - m_pDevicestackedWidget->addWidget(new QPushButton("Page 2")); m_pDevicestackedWidget->addWidget(new QPushButton("Page 3")); m_pDevicestackedWidget->addWidget(new QPushButton("Page 4")); m_pDevicestackedWidget->addWidget(new QPushButton("Page 5")); m_pDevicestackedWidget->addWidget(new QPushButton("Page 6")); - - + page1->InitializeTable(); + page2->InitializeTable(); } void MainDialog::CreateIcon(const QIcon& icon,QString text) diff --git a/applications/emsConfigurer/maindialog.h b/applications/emsConfigurer/maindialog.h index 21b0f9c..885658e 100644 --- a/applications/emsConfigurer/maindialog.h +++ b/applications/emsConfigurer/maindialog.h @@ -21,6 +21,9 @@ public: explicit MainDialog(QWidget *parent = nullptr); ~MainDialog(); + void InitializeUI(); + void loadWindowState(); + public slots: void changePage(QListWidgetItem *current, QListWidgetItem *previous); @@ -37,7 +40,7 @@ private: QToolBar *m_pMainToolBar; private: - void InitializeUI(); + void CreateToolbar(); void CreateIcon(const QIcon& icon,QString text); void CreateTablePage(); @@ -45,7 +48,6 @@ private: protected: void closeEvent(QCloseEvent *event) override; void saveWindowState(); - void loadWindowState(); }; #endif // MAINDIALOG_H diff --git a/applications/emsConfigurer/mainwindow.cpp b/applications/emsConfigurer/mainwindow.cpp index cb9e0e1..ccb6c6d 100644 --- a/applications/emsConfigurer/mainwindow.cpp +++ b/applications/emsConfigurer/mainwindow.cpp @@ -47,6 +47,8 @@ void MainWindow::setIp(const QString &ip) void MainWindow::on_pb_Logon_clicked() { m_pMainDialog = new MainDialog(); + m_pMainDialog->InitializeUI(); + m_pMainDialog->loadWindowState(); m_pMainDialog->show(); this->close(); } diff --git a/applications/emsConfigurer/mytablemodel.cpp b/applications/emsConfigurer/mytablemodel.cpp new file mode 100644 index 0000000..fa68aba --- /dev/null +++ b/applications/emsConfigurer/mytablemodel.cpp @@ -0,0 +1,140 @@ +#include +#include "mytablemodel.h" + + +MyTableModel::MyTableModel(QObject* parent) + :QAbstractTableModel(parent) +{ +} + +int MyTableModel::rowCount(const QModelIndex & /*parent*/) const +{ + return m_modelData.size(); +} + +int MyTableModel::columnCount(const QModelIndex & /*parent*/) const +{ + return AppData::getInstance()->lstDataTableHeaderText.count(); +} + +QVariant MyTableModel::data(const QModelIndex& index, int role) const +{ + if (!index.isValid()) + return QVariant(); + + if (role == Qt::DisplayRole || role == Qt::EditRole) + { + const int row = index.row(); + switch (index.column()) + { + case 0: + { + if (m_modelData.at(row).status == STATUS_NORMAL) return tr("Normal"); + if (m_modelData.at(row).status == STATUS_INFO) return tr("INFO"); + if (m_modelData.at(row).status == STATUS_WARN) return tr("WARN"); + if (m_modelData.at(row).status == STATUS_ERROR) return tr("ERROR"); + } + case 1: + { + return m_modelData.at(row).ParameterName.c_str(); + } + case 2: return m_modelData.at(row).value.c_str(); + case 3: return m_modelData.at(row).unit.c_str(); + case 4: return m_modelData.at(row).sampleTime.c_str(); + } + } + + //对齐处理 + if (role == Qt::TextAlignmentRole) + { + //const int row = index.row(); + switch (index.column()) + { + case 2: + case 3: + return QVariant(Qt::AlignLeft|Qt::AlignVCenter); + break; + case 4: + return QVariant(Qt::AlignRight|Qt::AlignVCenter); + break; + default: + return Qt::AlignCenter; + break; + } + } + + if (role == Qt::BackgroundRole) + { + const int row = index.row(); + switch (index.column()) + { + case 0: //状态 + case 2: //数值 + { + if (m_modelData.at(row).status == STATUS_WARN) + return QVariant(QColor(Qt::yellow)); + else if (m_modelData.at(row).status == STATUS_ERROR) + return QVariant(QColor(Qt::red)); + } + } + } + + return QVariant(); +} + +QVariant MyTableModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (role == Qt::DisplayRole && orientation == Qt::Horizontal) + { + if (section < m_headeList.size()) + { + return m_headeList[section]; + } + } + return QAbstractItemModel::headerData(section, orientation, role); +} + +const TableData *MyTableModel::getModelData() const +{ + return &m_modelData; +} + +bool MyTableModel::setData(const QModelIndex& index, const QVariant& value, int role) +{ + //beginResetModel(); + if (!index.isValid()) + return false; + + //endResetModel(); //在结束前添加此函数 + return QAbstractTableModel::setData(index, value, role); + +} + +Qt::ItemFlags MyTableModel::flags(const QModelIndex &index) const +{ + return Qt::ItemIsEditable | QAbstractTableModel::flags(index); +} + +void MyTableModel::setModelData(TableData data) +{ + //修改数据前后,用beginResetModel()和endResetModel() + beginResetModel(); //通过这个告诉我要开始修改model了 + m_modelData.clear(); + + for (int i = 0;i < data.count();++i) + { + m_modelData.append(data[i]); + } + endResetModel(); //通过这个告诉我修改model结束了 + +} + +void MyTableModel::clearModelData() +{ + m_modelData.clear(); +} + +void MyTableModel::setHeadData(QStringList i_list) +{ + m_headeList=i_list; +} diff --git a/applications/emsConfigurer/mytablemodel.h b/applications/emsConfigurer/mytablemodel.h new file mode 100644 index 0000000..6a35812 --- /dev/null +++ b/applications/emsConfigurer/mytablemodel.h @@ -0,0 +1,37 @@ +#pragma execution_character_set("utf-8") + +#ifndef MYTABLEMODEL_H +#define MYTABLEMODEL_H + +#include +#include +#include "globalparameters.h" + +class MyTableModel : public QAbstractTableModel +{ + Q_OBJECT + +public: + MyTableModel(QObject* parent); + + int rowCount(const QModelIndex& parent = QModelIndex()) const Q_DECL_OVERRIDE; + int columnCount(const QModelIndex& parent = QModelIndex()) const Q_DECL_OVERRIDE; + QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE; + bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) Q_DECL_OVERRIDE; + Qt::ItemFlags flags(const QModelIndex& index) const Q_DECL_OVERRIDE; + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; + + const TableData *getModelData() const; + +private: + TableData m_modelData; + QStringList m_headeList; + +public: + void setHeadData(QStringList i_list); + void setModelData(TableData data); + void clearModelData(); +}; + +#endif // MYTABLEMODEL_H + diff --git a/applications/emsConfigurer/singleton.h b/applications/emsConfigurer/singleton.h new file mode 100644 index 0000000..28fb811 --- /dev/null +++ b/applications/emsConfigurer/singleton.h @@ -0,0 +1,24 @@ +#ifndef SINGLETON_H +#define SINGLETON_H + +#include + +template +class Singleton +{ +public: + static T* getInstance() noexcept(std::is_nothrow_constructible::value) + { + static T instance{token()}; + return &instance; + } + virtual ~Singleton() =default; + Singleton(const Singleton&)=delete; + Singleton& operator =(const Singleton&)=delete; + +protected: + struct token{}; // helper class + Singleton() noexcept=default; +}; + +#endif // SINGLETON_H