当前位置: 首页 > article >正文

QT---------自定义插件和库

自定义界面组件

设计和使用自定义界面组件 (以 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 插件
  1. 创建一个新的插件项目。
  2. QDesignerCustomWidgetInterface 派生一个类,例如 TBatteryPlugin
#include <QDesignerCustomWidgetInterface>
#include <QtPlugin>
#include "tbattery.h"

class TBatteryPlugin : public QObject, public QDesignerCustomWidgetInterface {
    Q_OBJECT
    Q_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;
}
  1. 使用 Q_EXPORT_PLUGIN2 宏导出插件。
#include "tbatteryplugin.h"
Q_EXPORT_PLUGIN2(tbatteryplugin, TBatteryPlugin)
插件项目中各文件功能实现
  • tbattery.htbattery.cpp: 包含自定义组件 TBattery 的实现。
  • tbatteryplugin.htbatteryplugin.cpp: 实现 QDesignerCustomWidgetInterface 接口,用于在 QT Designer 中集成 TBattery 组件。
  • tbatteryplugin.json.pro 文件:包含插件的项目配置信息,如依赖、目标等。

在这里插入图片描述

插件的编译与安装
  1. 配置 .pro 文件,确保包含必要的模块和配置:
TEMPLATE = lib
CONFIG += plugin designer
HEADERS += tbattery.h tbatteryplugin.h
SOURCES += tbattery.cpp tbatteryplugin.cpp
  1. 编译项目,生成的插件文件(通常是 .dll.so)应放置在 QT Designer 的插件目录中,以便在设计器中加载。

使用自定义 widget 插件

  1. 打开 QT Designer,你应该可以在自定义组件库中看到 TBattery 组件。
  2. 将其拖放到界面上,像使用其他组件一样使用。

创建和使用静态库

创建静态库
  1. 创建一个新的库项目,在 .pro 文件中设置:
TEMPLATE = lib
CONFIG += staticlib
HEADERS += mylib.h
SOURCES += mylib.cpp
  1. 实现 mylib.hmylib.cpp
// mylib.h
#ifndef MYLIB_H
#define MYLIB_H

class 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;
}
使用静态库
  1. 在另一个项目的 .pro 文件中添加:
LIBS += -L/path/to/lib -lmylib
INCLUDEPATH += /path/to/lib
  1. 包含头文件并调用函数:
#include "mylib.h"

int main() {
    MyLib::myFunction();
    return 0;
}

创建和使用共享库

创建共享库
  1. .pro 文件中设置:
TEMPLATE = lib
CONFIG += shared
HEADERS += mylib.h
SOURCES += mylib.cpp
  1. 实现 mylib.hmylib.cpp 与静态库类似。
使用共享库
  1. .pro 文件中添加:
LIBS += -L/path/to/lib -lmylib
INCLUDEPATH += /path/to/lib
  1. 对于 Windows,可能需要将 .dll 文件复制到可执行文件目录或添加到系统路径。对于 Linux,可能需要设置 LD_LIBRARY_PATH
  2. 调用函数与静态库相同:
#include "mylib.h"

int main() {
    MyLib::myFunction();
    return 0;
}

代码解释

  • 自定义界面组件TBattery 类通过重绘事件 paintEvent 来实现自定义绘制,它从 QWidget 派生,可根据需要添加属性和方法,以实现更复杂的功能。
  • QT Designer 插件TBatteryPlugin 类将 TBattery 集成到 QT Designer 中,QDesignerCustomWidgetInterface 接口提供了各种函数,如 createWidget 用于创建实际的自定义组件,domXml 提供 XML 信息,group 定义组件所属的组等。
  • 静态库:静态库会被链接到可执行文件中,使代码在运行时无需额外的库文件,但会增加可执行文件大小。
  • 共享库:共享库是独立的文件,可被多个程序共享,减少代码冗余,但需要在运行时加载,可能会涉及一些环境变量设置。

在这里插入图片描述


http://www.kler.cn/a/464667.html

相关文章:

  • 《前端web开发-CSS3基础-1》
  • Fabric链码部署测试
  • PHP在做api开发中,RSA加密签名算法如何使用 ?
  • Java SpringBoot使用Apache POI导入导出Excel文件
  • 三甲医院等级评审八维数据分析应用(五)--数据集成与共享篇
  • 【ShuQiHere】使用 SCP 进行安全文件传输
  • Unity3D Huatuo:零成本高性能的全平台原生C#热更新方案详解
  • 玩《燕云十六声》时游戏文件丢失怎么办?
  • RabbitMQ基础篇之Java客户端 Topic交换机
  • 基于VSCode软件框架的RISC-V IDE MRS2正式上线发布
  • 使用Pandoc复制ChatGPT生成的高数公式文本
  • 学习笔记078——Java Properties类使用详解
  • js按日期按数量进行倒序排序,然后再新增一个字段,给这个字段赋值 10 到1
  • Lua迭代器如何使用?
  • element ui 组件 时间选择器出现转换问题的解决办法
  • 【门铃工作原理】2021-12-25
  • scipy和statsmodels之Python实现
  • Unity网络通信相关
  • 算命网站源码PHP框架_附2025新版设计书教程
  • Linux系统编程:深入理解计算机软硬件体系和架构
  • 前端页面上传文件:解决 ERR_UPLOAD_FILE_CHANGED
  • 基于Python flask 的微博高校舆情分析系统,高校微博情感分析大屏可视化
  • sql优化(1)
  • 优化现金流:CRM回款自动化的关键步骤
  • C++软件设计模式之状态模式
  • H3C Tftp 备份与恢复配置文件