在之前搭建的框架基础上添加一个自定义插件,该插件可以和之前的核心插件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 // HELLOPAGE_H

界面继承自核心插件页面接口 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 // HELLOSETTINGS_H

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);

//hello settings
new HelloSettings();

//hello page
ExtensionSystem::PluginManager::addObject(new HelloPage);
}

void HelloPlugin::extensionsInitialized()
{
}

这样处理后,核心插件就可以通过插件框架机制加载这两个界面。

2.3、最终效果
  • 页面如下:

  • 设置界面如下: