之前的核心插件比较简单,仅仅用于显示一个主窗口,这里扩展其功能,使它可以与其他插件进行联系起来。下面就先实现一个设置扩展功能:
- 一个设置界面接口,其他插件可以通过这个接口添加自己的设置界面;
1、设置界面接口
该接口管理所有的设置界面,由IOptionPage接口类和IOptionPageWidget接口类组成,即使用QtCreator源码中coreplugin插件下Dialogs文件夹下的实现源码。
1.1、IOptionPage/IOptionPageWidget接口
直接使用QtCreator的CorePlugin文件夹下的Dialogs/IOptionPage源码,其他设置界面则继承该接口,并在对应的插件初始化时候实例化对象。
2、系统设置界面
2.1、创建系统设置界面SystemSettings
该设置界面为主程序通用设置界面,如语言选择、字体设置、主题颜色设置等,实现方法如下:
- 头文件 systemsettings.h:
#ifndef SYSTEMSETTINGS_H
#define SYSTEMSETTINGS_H
#include <QObject>
#include <coreplugin/dialogs/ioptionspage.h>
class SystemSettings : public Core::IOptionsPage
{
public:
SystemSettings();
};
#endif // SYSTEMSETTINGS_H
- 实现文件systemsettings.cpp:
#include "systemsettings.h"
#include "ui_SystemSettings.h"
#include <QDebug>
using namespace Core;
class SystemSettingsWidget : public Core::IOptionsPageWidget
{
public:
SystemSettingsWidget() {
m_ui.setupUi(this);
m_ui.comboBox->addItems(QStringList()<<"set1"<<"set2"<<"set3");
}
void apply() override;
private:
Ui::SystemSettings m_ui;
};
void SystemSettingsWidget::apply()
{
qDebug()<<" system settings apply";
}
SystemSettings::SystemSettings()
{
setId("SystemSetting");
setCategory("System");
setDisplayName("SystemSetting");
setWidgetCreator([] {return new SystemSettingsWidget;});
}
- 界面文件
界面这里直接添加一个名字为SystemSettings.ui文件方便直接用QtDesigner设计,Object名字改为SystemSettings,编译后可以生成 ui_SystemSettings.h 头文件; 然后我们就可以直接使用该界面作为设置界面了,即上面的 Ui::SystemSettings,使用:m_ui.setupUi(this);
2.2、实例化设置界面对象
直接在对应的插件初始化时候创建,这里SystemSettings设置在CorePlugin初始化时候创建:
bool CorePlugin::initialize(const QStringList &, QString *)
{
...
//system settings
new SystemSettings();
return true;
}
3、加载设置界面
SystemSettings设置界面创建后,需要在设置窗口加载使用。
3.1、创建主设置窗口
- 先创建设置窗口,该窗口为程序的所有设置界面的容器;
- 窗体由两部分:界面左边放置一个List控件,右边为StackWidget控件; list控件用于显示设置的名字,StackWidget则放置由插件添加的设置窗体。
- 加载所有的设置界面:
SettingsDialog::SettingsDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::SettingsDialog)
{
ui->setupUi(this);
//model dialog
this->setModal(true);
//load settings page
QList<IOptionsPage*> optionPages = IOptionsPage::allOptionsPages();
foreach(IOptionsPage* page, optionPages){
qDebug()<<" add setting page:"<<page->id()<<","<<page->category();
ui->categoryList->addItem(page->id());
ui->stackedWidget->addWidget(page->widget());
}
......
}
这里是通过IOptionPage接口中提供的allOptionsPages() 函数获取到所有设置界面,然后把每个设置的名字和窗体加到主设置窗口中。
3.2、显示设置界面
要显示设置界面,需要通过菜单、工具栏的QAction来激活,这里是通过主界面的工具栏按钮:
#include "coreplugin.h"
#include <QLabel>
#include <QDebug>
#include <QAction>
#include <QToolBar>
#include <coreplugin/dialogs/ioptionspage.h>
#include <coreplugin/dialogs/settingsdialog.h>
#include "systemsettings.h"
using namespace Core;
bool CorePlugin::initialize(const QStringList &, QString *)
{
qDebug()<<__FILE__<<" at line "<<__LINE__<<" :"<<" coreplugin initialize";
QMainWindow *mwin = new QMainWindow;
QLabel *label = new QLabel(mwin);
label->setText("corePlugin");
mwin->setCentralWidget(label);
mwin->setMinimumSize(800,400);
mwin->setWindowTitle("MonkeyQDK 0.01 by MakerInChina");
QAction *actSetting = new QAction("setting");
connect(actSetting,&QAction::triggered,this,&CorePlugin::settingsDialog);
QToolBar *mainToolbar = new QToolBar("ToolBar",mwin);
mainToolbar->addAction(actSetting);
mwin->addToolBar(Qt::TopToolBarArea,mainToolbar);
m_mainWindow.reset(mwin);
//system settings
new SystemSettings();
return true;
}
void CorePlugin::extensionsInitialized()
{
}
QObject *CorePlugin::remoteCommand(const QStringList &, const QString &, const QStringList &)
{
m_mainWindow->show();
return nullptr;
}
void CorePlugin::settingsDialog()
{
SettingsDialog *settingDialog = new SettingsDialog;
settingDialog->exec();
}
- 先在CorePlugin的初始化函数中添加一个工具栏并加入一个按钮用于激活设置窗口;
- 设置按钮点击后创建设置窗体并执行进行显示;
3.3、效果如下
点击工具栏的设置按钮 setting 后,会出现如下设置窗体界面:
settingsdialog.png
网友评论