在之前搭建的框架基础上添加一个自定义插件,该插件可以和之前的核心插件Coreplugin的设置接口和页面显示接口进行联系起来,以扩展程序的功能。
1、说明
1.1、实现功能
在之前搭建的插件框架基础上添加自己的插件,这个插件为一个简单的示例插件,仅显示一个简单的界面。
1.2、实现方法
- 这个插件的显示界面通过核心插件的页面接口进行添加;
- 插件的设置界面通过核心插件的设置接口进行添加;
2、具体实现
2.1、插件主界面
1 2 3 4 5 6 7 8 9 10 11 12 13
| #ifndef HELLOPAGE_H #define HELLOPAGE_H
#include <coreplugin/fancypage.h>
class HelloPage : public Core::FancyPage { public: HelloPage(); };
#endif
|
界面继承自核心插件页面接口 FancyPage 类,然后构造函数中实现界面:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #include "hellopage.h"
#include <QVBoxLayout> #include <QHBoxLayout> #include <QLabel> #include <QPushButton> #include <QMessageBox>
HelloPage::HelloPage() { QWidget *helloWidget = new QWidget;
QHBoxLayout *mainLayout = new QHBoxLayout(helloWidget); helloWidget->setLayout(mainLayout);
QLabel *label = new QLabel(helloWidget); label->setText("Hello Page"); QFont font("Microsoft YaHei", 10, 75); label->setFont(font); label->setStyleSheet("color:red;"); label->setAlignment(Qt::AlignCenter); mainLayout->addWidget(label);
QPushButton *btn = new QPushButton(helloWidget); btn->setText("HelloMessage"); connect(btn,&QPushButton::clicked,[=](){ QMessageBox::information(helloWidget, "HelloPlugin", "this is a demo plugin page"); });
mainLayout->addWidget(btn);
setButtonName("Hello"); setWidget(helloWidget); }
|
主要是先创建窗体控件,然后由setWidget方法将它添加到页面中,setButtonName则设置界面的选择按钮文字。
2.2、插件设置界面
插件设置界面继承自核心插件的设置接口IOptionPage类,实现如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #ifndef HELLOSETTINGS_H #define HELLOSETTINGS_H
#include "hello_global.h" #include <coreplugin/dialogs/ioptionspage.h>
class HELLOPLUGIN_EXPORT HelloSettings : public Core::IOptionsPage { public: HelloSettings(); };
#endif
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| #include "hellosettings.h"
#include <QCoreApplication> #include <QDebug> #include <QHBoxLayout> #include <QPushButton> #include <QLabel>
#include "ui_HelloSettings.h"
using namespace Core;
class HelloSettingsPageWidget : public Core::IOptionsPageWidget { public: HelloSettingsPageWidget() { m_ui.setupUi(this);
m_ui.comboBox->addItems(QStringList()<<"test1"<<"test2"<<"test3");
}
void apply() override;
private: Ui::HelloSettings m_ui; };
void HelloSettingsPageWidget::apply() { qDebug()<<" hello settings apply"; }
HelloSettings::HelloSettings() { setId("HelloSetting"); setDisplayName("general"); setCategory("HelloSetting"); setCategoryIconPath(":/image/settingscategory.png"); setWidgetCreator([] {return new HelloSettingsPageWidget;}); }
|
其中的设置窗体界面可以直接用QtDesigner工具创建。
2.3、实例化窗体
上面两个部分创建后,需要在插件初始化时实例化:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #include "helloplugin.h"
#include <QMessageBox>
#include <extensionsystem/pluginmanager.h>
#include "hellosettings.h" #include "hellopage.h"
HelloPlugin::HelloPlugin() {
}
HelloPlugin::~HelloPlugin() {
}
bool HelloPlugin::initialize(const QStringList &arguments, QString *errorString) { Q_UNUSED(arguments); Q_UNUSED(errorString);
new HelloSettings();
ExtensionSystem::PluginManager::addObject(new HelloPage); }
void HelloPlugin::extensionsInitialized() { }
|
这样处理后,核心插件就可以通过插件框架机制加载这两个界面。
2.3、最终效果