自定义界面组件
设计和使用自定义界面组件 (以 TBattery 为例)
假设我们要创建一个自定义的电池显示组件 TBattery,我们可以从 QWidget 派生一个新的类:
#include <QWidget>
#include <QPainter>class TBattery : public QWidget {Q_OBJECT
public:TBattery(QWidget *parent = nullptr);
protected:void paintEvent(QPaintEvent *event) override;
private:int batteryLevel; // 电池电量水平
};TBattery::TBattery(QWidget *parent) : QWidget(parent), batteryLevel(50) {// 初始化组件,例如设置大小等setFixedSize(100, 50);
}void TBattery::paintEvent(QPaintEvent *event) {QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);// 绘制电池轮廓painter.drawRect(0, 0, width() - 10, height() - 1);// 根据电量绘制填充部分int fillWidth = (width() - 10) * batteryLevel / 100;painter.fillRect(2, 2, fillWidth, height() - 4, Qt::green);
}
设计和使用 QT Designer Widget 插件
创建 QT Designer Widget 插件
- 创建一个新的插件项目。
- 从
QDesignerCustomWidgetInterface
派生一个类,例如TBatteryPlugin
。
#include <QDesignerCustomWidgetInterface>
#include <QtPlugin>
#include "tbattery.h"class TBatteryPlugin : public QObject, public QDesignerCustomWidgetInterface {Q_OBJECTQ_INTERFACES(QDesignerCustomWidgetInterface)
public:TBatteryPlugin(QObject *parent = nullptr);// 以下是 QDesignerCustomWidgetInterface 的实现部分bool isContainer() const override;bool isInitialized() const override;QIcon icon() const override;QString domXml() const override;QString group() const override;QString includeFile() const override;QString name() const override;QString toolTip() const override;QString whatsThis() const override;QWidget *createWidget(QWidget *parent) override;void initialize(QDesignerFormEditorInterface *core) override;
private:bool initialized;
};TBatteryPlugin::TBatteryPlugin(QObject *parent) : QObject(parent), initialized(false) {}bool TBatteryPlugin::isContainer() const { return false; }
bool TBatteryPlugin::isInitialized() const { return initialized; }
QIcon TBatteryPlugin::icon() const { return QIcon(); }
QString TBatteryPlugin::domXml() const {return "<ui language=\"c++\">\n"" <widget class=\"TBattery\" name=\"tBattery\">\n"" </widget>\n""</ui>";
}
QString TBatteryPlugin::group() const { return "Custom Widgets"; }
QString TBatteryPlugin::includeFile() const { return "tbattery.h"; }
QString TBatteryPlugin::name() const { return "TBattery"; }
QString TBatteryPlugin::toolTip() const { return "A custom battery widget"; }
QString TBatteryPlugin::whatsThis() const { return "This is a custom battery widget."; }
QWidget *TBatteryPlugin::createWidget(QWidget *parent) { return new TBattery(parent); }
void TBatteryPlugin::initialize(QDesignerFormEditorInterface *core) {if (initialized) return;initialized = true;
}
- 使用
Q_EXPORT_PLUGIN2
宏导出插件。
#include "tbatteryplugin.h"
Q_EXPORT_PLUGIN2(tbatteryplugin, TBatteryPlugin)
插件项目中各文件功能实现
tbattery.h
和tbattery.cpp
: 包含自定义组件TBattery
的实现。tbatteryplugin.h
和tbatteryplugin.cpp
: 实现QDesignerCustomWidgetInterface
接口,用于在 QT Designer 中集成TBattery
组件。tbatteryplugin.json
或.pro
文件:包含插件的项目配置信息,如依赖、目标等。
插件的编译与安装
- 配置
.pro
文件,确保包含必要的模块和配置:
TEMPLATE = lib
CONFIG += plugin designer
HEADERS += tbattery.h tbatteryplugin.h
SOURCES += tbattery.cpp tbatteryplugin.cpp
- 编译项目,生成的插件文件(通常是
.dll
或.so
)应放置在 QT Designer 的插件目录中,以便在设计器中加载。
使用自定义 widget 插件
- 打开 QT Designer,你应该可以在自定义组件库中看到
TBattery
组件。 - 将其拖放到界面上,像使用其他组件一样使用。
创建和使用静态库
创建静态库
- 创建一个新的库项目,在
.pro
文件中设置:
TEMPLATE = lib
CONFIG += staticlib
HEADERS += mylib.h
SOURCES += mylib.cpp
- 实现
mylib.h
和mylib.cpp
:
// mylib.h
#ifndef MYLIB_H
#define MYLIB_Hclass MyLib {
public:static void myFunction();
};#endif // MYLIB_H// mylib.cpp
#include "mylib.h"
#include <iostream>void MyLib::myFunction() {std::cout << "This is a function from the static library." << std::endl;
}
使用静态库
- 在另一个项目的
.pro
文件中添加:
LIBS += -L/path/to/lib -lmylib
INCLUDEPATH += /path/to/lib
- 包含头文件并调用函数:
#include "mylib.h"int main() {MyLib::myFunction();return 0;
}
创建和使用共享库
创建共享库
- 在
.pro
文件中设置:
TEMPLATE = lib
CONFIG += shared
HEADERS += mylib.h
SOURCES += mylib.cpp
- 实现
mylib.h
和mylib.cpp
与静态库类似。
使用共享库
- 在
.pro
文件中添加:
LIBS += -L/path/to/lib -lmylib
INCLUDEPATH += /path/to/lib
- 对于 Windows,可能需要将
.dll
文件复制到可执行文件目录或添加到系统路径。对于 Linux,可能需要设置LD_LIBRARY_PATH
。 - 调用函数与静态库相同:
#include "mylib.h"int main() {MyLib::myFunction();return 0;
}
代码解释:
- 自定义界面组件:
TBattery
类通过重绘事件paintEvent
来实现自定义绘制,它从QWidget
派生,可根据需要添加属性和方法,以实现更复杂的功能。 - QT Designer 插件:
TBatteryPlugin
类将TBattery
集成到 QT Designer 中,QDesignerCustomWidgetInterface
接口提供了各种函数,如createWidget
用于创建实际的自定义组件,domXml
提供 XML 信息,group
定义组件所属的组等。 - 静态库:静态库会被链接到可执行文件中,使代码在运行时无需额外的库文件,但会增加可执行文件大小。
- 共享库:共享库是独立的文件,可被多个程序共享,减少代码冗余,但需要在运行时加载,可能会涉及一些环境变量设置。