123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- #include "dialogconfig.h"
- #include <QFile>
- #include <QDirModel>
- #include <QHBoxLayout>
- #include <QSplitter>
- #include <QDebug>
- #include <QStandardItemModel>
- #include <QPluginLoader>
- #include <QCoreApplication>
- #include <rootform.h>
- #include <subnormalconfig.h>
- #include "CustomImportInterface.h"
- #define TreeNodeDataId (Qt::UserRole + 2)
- enum TreeNodeMask
- {
- NormalConfig,
- RootIniConfig,
- CustomConfig
- };
- DialogConfig::DialogConfig(DialogInParam* inParam, QWidget *parent)
- :QDialog(parent),mCustomParentNode(nullptr)
- {
- Qt::WindowFlags windowFlag = Qt::Dialog;
- windowFlag |= Qt::WindowMinimizeButtonHint;
- windowFlag |= Qt::WindowMaximizeButtonHint;
- windowFlag |= Qt::WindowCloseButtonHint;
- setWindowFlags(windowFlag);
- QSplitter* splitterMain = new QSplitter(Qt::Horizontal, this);
- splitterMain->setOpaqueResize(true);
- mTreeView = new QTreeView(splitterMain);
- mTreeView->setHeaderHidden(true);
- QStandardItemModel* model = new QStandardItemModel(mTreeView);
- mTreeView->setModel(model);
- QStandardItem* itemNormal = new QStandardItem("通用设置");
- itemNormal->setData(NormalConfig, TreeNodeDataId);
- model->appendRow(itemNormal);
- QStandardItem* item1 = new QStandardItem("终端设置");
- model->appendRow(item1);
- QStandardItem* itemRoot = new QStandardItem("Root.ini设置");
- itemRoot->setData(RootIniConfig, TreeNodeDataId);
- item1->appendRow(itemRoot);
- connect(mTreeView->selectionModel(), &QItemSelectionModel::selectionChanged, this, &DialogConfig::mainTreeSelectionChanged);
- //connect(mTreeView, SIGNAL(clicked(const QModelIndex)), this, SLOT(mainTreeViewDoubleClick(const QModelIndex)));
- ////////////////////////////////////////////////////
- QWidget *mainWidget = new QWidget(splitterMain);
- QVBoxLayout* mainLayout = new QVBoxLayout(mainWidget);
- //mainLayout->setSpacing(6);
- //mainLayout->setContentsMargins(11, 11, 11, 11);
- mainWidget->setLayout(mainLayout);
- splitterMain->addWidget(mainWidget);
- mStackWidget = new QStackedWidget(mainWidget);
- mainLayout->addWidget(mStackWidget);
- SubNormalConfig* subNormalWidget = new SubNormalConfig(mainWidget);
- mStackWidget->addWidget(subNormalWidget);
- RootForm* rootWidget = new RootForm(inParam->rootIniPath, mStackWidget);
- mStackWidget->addWidget(rootWidget);
- LoadPlguins();
- splitterMain->setStretchFactor(1, 1);
- splitterMain->setStretchFactor(2, 1);
- QHBoxLayout *contentLayout = new QHBoxLayout;
- contentLayout->setMargin(0);
- contentLayout->setContentsMargins(0,0,0,0);
- contentLayout->addWidget(splitterMain);
- setLayout(contentLayout);
- resize(1024, 640);
- setWindowTitle(tr("选项"));
- }
- bool DialogConfig::LoadPlguins()
- {
- int pluginCount = 0;
- #ifdef WITH_QT
- QDir pluginsDir(QCoreApplication::applicationDirPath());
- pluginsDir.cd("plugins");
- qDebug() << "plugin dir: " << pluginsDir.absolutePath() << endl;
- #ifdef Q_WS_WIN32
- const QStringList entries = pluginsDir.entryList(QStringList() << "*.dll", QDir::Files);
- #else
- const QStringList entries = pluginsDir.entryList(QStringList() << "*.so", QDir::Files);
- #endif
- for (const QString &fileName : entries) {
- QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
- qDebug() << "plugin file: " << pluginsDir.absoluteFilePath(fileName) << endl;
- QObject *plugin = pluginLoader.instance();
- if (plugin) {
- qDebug() << "class name: " << plugin->metaObject()->className() << endl;
- const QMetaObject* mode = plugin->metaObject()->superClass();
- while (mode != nullptr) {
- qDebug() << "super class name: " << mode->className();
- mode = mode->superClass();
- }
- CustomImportInterface* pluginItem = qobject_cast<CustomImportInterface *>(plugin);
- if (pluginItem) {
- QStringList empty;
- empty << "HelloHia";
- QWidget* customWidget = pluginItem->getComponent(this, empty);
- if(customWidget != nullptr) {
- mStackWidget->addWidget(customWidget);
- if(mCustomParentNode == nullptr) {
- mCustomParentNode = new QStandardItem("自定义");
- QStandardItemModel* treeModel = reinterpret_cast<QStandardItemModel*>(mTreeView->model());
- treeModel->appendRow(mCustomParentNode);
- }
- QString pluginTitle = pluginItem->getDisplayText();
- QStandardItem* menuItem = new QStandardItem(pluginTitle);
- menuItem->setData(CustomConfig + pluginCount, TreeNodeDataId);
- mCustomParentNode->appendRow(menuItem);
- pluginCount++;
- } else {
- qDebug() << "getComponent failed:" << endl;
- }
- } else {
- qDebug() << "dynamic_cast qobject cast failed:" << endl;
- }
- } else {
- qDebug() << "plug instance failed: " << pluginLoader.errorString() << endl;
- }
- pluginLoader.unload();
- }
- #else
- QString fileName = "D:/Projects/Qt/build-MediaDevDetect-Desktop_Qt_5_14_2_MSVC2017_32bit-Debug/debug/MediaDevDetect.dll";
- QPluginLoader pluginLoader(fileName);
- QObject *plugin = pluginLoader.instance();
- if (plugin) {
- CustomImportInterface* pluginItem = qobject_cast<CustomImportInterface *>(plugin);
- if (pluginItem) {
- QStringList empty;
- empty << "HelloHia";
- QWidget* customWidget = pluginItem->getComponent(this, empty);
- if(customWidget != nullptr) {
- QString pluginTitle = pluginItem->getDisplayText();
- mStackWidget->addWidget(customWidget);
- if(mCustomParentNode == nullptr) {
- mCustomParentNode = new QStandardItem("Custom");
- QStandardItemModel* temp = reinterpret_cast<QStandardItemModel*>(mTreeView->model());
- temp->appendRow(mCustomParentNode);
- }
- QStandardItem* menuItem = new QStandardItem(pluginTitle);
- menuItem->setData(CustomConfig + pluginCount, TreeNodeDataId);
- mCustomParentNode->appendRow(menuItem);
- pluginCount++;
- }
- }
- }
- pluginLoader.unload();
- #endif
- return false;
- }
- void DialogConfig::mainTreeSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
- {
- qDebug() << "Enter DialogConfig::mainTreeSelectionChanged" << endl;
- QItemSelectionModel *selections = mTreeView->selectionModel();
- QModelIndexList indexes = selections->selectedIndexes();
- foreach(QModelIndex index, indexes)
- {
- //从索引index获取item指针,mModel是tree的数据Model,这里是QStandardItemModel*类型
- QStandardItem* item = ((QStandardItemModel*)mTreeView->model())->itemFromIndex(index);
- if (item && index.data(TreeNodeDataId).isValid())
- {
- qDebug() << "Enter " << item->text() << " " << index.row() << " " << index.column() << " " << index.data(TreeNodeDataId) << endl;
- TreeNodeMask menuID = static_cast<TreeNodeMask>(index.data(TreeNodeDataId).toInt());
- bool done = true;
- switch(menuID) {
- case RootIniConfig:
- mStackWidget->setCurrentIndex(RootIniConfig);
- done = true;
- break;
- case NormalConfig:
- mStackWidget->setCurrentIndex(NormalConfig);
- break;
- default:
- mStackWidget->setCurrentIndex(menuID);
- done = false;
- break;
- }
- if(done) {
- break;
- }
- }
- }
- }
- void DialogConfig::mainTreeViewDoubleClick(const QModelIndex index)
- {
- QAbstractItemModel* m=(QAbstractItemModel*)index.model();
- for(int columnIndex = 0; columnIndex < m->columnCount(); columnIndex++)
- {
- QModelIndex x=m->index(index.row(),columnIndex);
- QString s= x.data().toString();
- qDebug() << "mainTreeViewDoubleClick " << s << " " << x.internalId() << endl;
- }
- }
|