dialogconfig.cpp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. #include "dialogconfig.h"
  2. #include <QFile>
  3. #include <QDirModel>
  4. #include <QHBoxLayout>
  5. #include <QSplitter>
  6. #include <QDebug>
  7. #include <QStandardItemModel>
  8. #include <QPluginLoader>
  9. #include <QCoreApplication>
  10. #include <rootform.h>
  11. #include <subnormalconfig.h>
  12. #include "CustomImportInterface.h"
  13. #define TreeNodeDataId (Qt::UserRole + 2)
  14. enum TreeNodeMask
  15. {
  16. NormalConfig,
  17. RootIniConfig,
  18. CustomConfig
  19. };
  20. DialogConfig::DialogConfig(DialogInParam* inParam, QWidget *parent)
  21. :QDialog(parent),mCustomParentNode(nullptr)
  22. {
  23. Qt::WindowFlags windowFlag = Qt::Dialog;
  24. windowFlag |= Qt::WindowMinimizeButtonHint;
  25. windowFlag |= Qt::WindowMaximizeButtonHint;
  26. windowFlag |= Qt::WindowCloseButtonHint;
  27. setWindowFlags(windowFlag);
  28. QSplitter* splitterMain = new QSplitter(Qt::Horizontal, this);
  29. splitterMain->setOpaqueResize(true);
  30. mTreeView = new QTreeView(splitterMain);
  31. mTreeView->setHeaderHidden(true);
  32. QStandardItemModel* model = new QStandardItemModel(mTreeView);
  33. mTreeView->setModel(model);
  34. QStandardItem* itemNormal = new QStandardItem("通用设置");
  35. itemNormal->setData(NormalConfig, TreeNodeDataId);
  36. model->appendRow(itemNormal);
  37. QStandardItem* item1 = new QStandardItem("终端设置");
  38. model->appendRow(item1);
  39. QStandardItem* itemRoot = new QStandardItem("Root.ini设置");
  40. itemRoot->setData(RootIniConfig, TreeNodeDataId);
  41. item1->appendRow(itemRoot);
  42. connect(mTreeView->selectionModel(), &QItemSelectionModel::selectionChanged, this, &DialogConfig::mainTreeSelectionChanged);
  43. //connect(mTreeView, SIGNAL(clicked(const QModelIndex)), this, SLOT(mainTreeViewDoubleClick(const QModelIndex)));
  44. ////////////////////////////////////////////////////
  45. QWidget *mainWidget = new QWidget(splitterMain);
  46. QVBoxLayout* mainLayout = new QVBoxLayout(mainWidget);
  47. //mainLayout->setSpacing(6);
  48. //mainLayout->setContentsMargins(11, 11, 11, 11);
  49. mainWidget->setLayout(mainLayout);
  50. splitterMain->addWidget(mainWidget);
  51. mStackWidget = new QStackedWidget(mainWidget);
  52. mainLayout->addWidget(mStackWidget);
  53. SubNormalConfig* subNormalWidget = new SubNormalConfig(mainWidget);
  54. mStackWidget->addWidget(subNormalWidget);
  55. RootForm* rootWidget = new RootForm(inParam->rootIniPath, mStackWidget);
  56. mStackWidget->addWidget(rootWidget);
  57. LoadPlguins();
  58. splitterMain->setStretchFactor(1, 1);
  59. splitterMain->setStretchFactor(2, 1);
  60. QHBoxLayout *contentLayout = new QHBoxLayout;
  61. contentLayout->setMargin(0);
  62. contentLayout->setContentsMargins(0,0,0,0);
  63. contentLayout->addWidget(splitterMain);
  64. setLayout(contentLayout);
  65. resize(1024, 640);
  66. setWindowTitle(tr("选项"));
  67. }
  68. bool DialogConfig::LoadPlguins()
  69. {
  70. int pluginCount = 0;
  71. #ifdef WITH_QT
  72. QDir pluginsDir(QCoreApplication::applicationDirPath());
  73. pluginsDir.cd("plugins");
  74. qDebug() << "plugin dir: " << pluginsDir.absolutePath() << endl;
  75. #ifdef Q_WS_WIN32
  76. const QStringList entries = pluginsDir.entryList(QStringList() << "*.dll", QDir::Files);
  77. #else
  78. const QStringList entries = pluginsDir.entryList(QStringList() << "*.so", QDir::Files);
  79. #endif
  80. for (const QString &fileName : entries) {
  81. QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
  82. qDebug() << "plugin file: " << pluginsDir.absoluteFilePath(fileName) << endl;
  83. QObject *plugin = pluginLoader.instance();
  84. if (plugin) {
  85. qDebug() << "class name: " << plugin->metaObject()->className() << endl;
  86. const QMetaObject* mode = plugin->metaObject()->superClass();
  87. while (mode != nullptr) {
  88. qDebug() << "super class name: " << mode->className();
  89. mode = mode->superClass();
  90. }
  91. CustomImportInterface* pluginItem = qobject_cast<CustomImportInterface *>(plugin);
  92. if (pluginItem) {
  93. QStringList empty;
  94. empty << "HelloHia";
  95. QWidget* customWidget = pluginItem->getComponent(this, empty);
  96. if(customWidget != nullptr) {
  97. mStackWidget->addWidget(customWidget);
  98. if(mCustomParentNode == nullptr) {
  99. mCustomParentNode = new QStandardItem("自定义");
  100. QStandardItemModel* treeModel = reinterpret_cast<QStandardItemModel*>(mTreeView->model());
  101. treeModel->appendRow(mCustomParentNode);
  102. }
  103. QString pluginTitle = pluginItem->getDisplayText();
  104. QStandardItem* menuItem = new QStandardItem(pluginTitle);
  105. menuItem->setData(CustomConfig + pluginCount, TreeNodeDataId);
  106. mCustomParentNode->appendRow(menuItem);
  107. pluginCount++;
  108. } else {
  109. qDebug() << "getComponent failed:" << endl;
  110. }
  111. } else {
  112. qDebug() << "dynamic_cast qobject cast failed:" << endl;
  113. }
  114. } else {
  115. qDebug() << "plug instance failed: " << pluginLoader.errorString() << endl;
  116. }
  117. pluginLoader.unload();
  118. }
  119. #else
  120. QString fileName = "D:/Projects/Qt/build-MediaDevDetect-Desktop_Qt_5_14_2_MSVC2017_32bit-Debug/debug/MediaDevDetect.dll";
  121. QPluginLoader pluginLoader(fileName);
  122. QObject *plugin = pluginLoader.instance();
  123. if (plugin) {
  124. CustomImportInterface* pluginItem = qobject_cast<CustomImportInterface *>(plugin);
  125. if (pluginItem) {
  126. QStringList empty;
  127. empty << "HelloHia";
  128. QWidget* customWidget = pluginItem->getComponent(this, empty);
  129. if(customWidget != nullptr) {
  130. QString pluginTitle = pluginItem->getDisplayText();
  131. mStackWidget->addWidget(customWidget);
  132. if(mCustomParentNode == nullptr) {
  133. mCustomParentNode = new QStandardItem("Custom");
  134. QStandardItemModel* temp = reinterpret_cast<QStandardItemModel*>(mTreeView->model());
  135. temp->appendRow(mCustomParentNode);
  136. }
  137. QStandardItem* menuItem = new QStandardItem(pluginTitle);
  138. menuItem->setData(CustomConfig + pluginCount, TreeNodeDataId);
  139. mCustomParentNode->appendRow(menuItem);
  140. pluginCount++;
  141. }
  142. }
  143. }
  144. pluginLoader.unload();
  145. #endif
  146. return false;
  147. }
  148. void DialogConfig::mainTreeSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
  149. {
  150. qDebug() << "Enter DialogConfig::mainTreeSelectionChanged" << endl;
  151. QItemSelectionModel *selections = mTreeView->selectionModel();
  152. QModelIndexList indexes = selections->selectedIndexes();
  153. foreach(QModelIndex index, indexes)
  154. {
  155. //从索引index获取item指针,mModel是tree的数据Model,这里是QStandardItemModel*类型
  156. QStandardItem* item = ((QStandardItemModel*)mTreeView->model())->itemFromIndex(index);
  157. if (item && index.data(TreeNodeDataId).isValid())
  158. {
  159. qDebug() << "Enter " << item->text() << " " << index.row() << " " << index.column() << " " << index.data(TreeNodeDataId) << endl;
  160. TreeNodeMask menuID = static_cast<TreeNodeMask>(index.data(TreeNodeDataId).toInt());
  161. bool done = true;
  162. switch(menuID) {
  163. case RootIniConfig:
  164. mStackWidget->setCurrentIndex(RootIniConfig);
  165. done = true;
  166. break;
  167. case NormalConfig:
  168. mStackWidget->setCurrentIndex(NormalConfig);
  169. break;
  170. default:
  171. mStackWidget->setCurrentIndex(menuID);
  172. done = false;
  173. break;
  174. }
  175. if(done) {
  176. break;
  177. }
  178. }
  179. }
  180. }
  181. void DialogConfig::mainTreeViewDoubleClick(const QModelIndex index)
  182. {
  183. QAbstractItemModel* m=(QAbstractItemModel*)index.model();
  184. for(int columnIndex = 0; columnIndex < m->columnCount(); columnIndex++)
  185. {
  186. QModelIndex x=m->index(index.row(),columnIndex);
  187. QString s= x.data().toString();
  188. qDebug() << "mainTreeViewDoubleClick " << s << " " << x.internalId() << endl;
  189. }
  190. }