Qt中自定义插件和库(1)

Qt中自定义插件和库(1)

在Qt中自定义插件和库的方法有两种:

1.提升法。

2.自定义Qt Designer 插件法。

下面就以《Qt 5.9 C++开发指南》一书中的例子来讲解。下面先讲提升法。

一、提升法

提升法(Promotion)是Qt Designer中重用自定义控件的一种方法,允许你将标准Qt控件"提升"为你自己创建的派生类控件。

基本步骤

1. 创建自定义控件类

  • 在Qt中创建一个新的类,继承自QWidget或其他Qt控件类。例如,创建一个自定义的电池UI控件TBattery,继承自QWidget。
  • 在该类的头文件中,使用Q_OBJECT宏声明该类为一个Qt对象。
  • 在类的实现文件中,重写paintEvent等事件处理函数,实现自定义的绘制逻辑。

qmybattery.h文件

C++ 复制代码
#ifndef QMYBATTERY_H
#define QMYBATTERY_H

#include <QObject>
#include <QWidget>
#include<QColor>
#include<QSize>

class QMyBattery : public QWidget
{
    Q_OBJECT
public:
    explicit QMyBattery(QWidget *parent = nullptr);

protected:
    virtual void paintEvent(QPaintEvent *event);

public:
    // 设置当前电量
    void setCurPowerValue(int nValue);
    int powerLevel();
    // 设置低警示电量
    void setWarnLevel(int nValue);
    int warnLevel();
    // 默认大小
    QSize sizeHint();
signals:
    void powerLevelChange(int nLevel);

private:
    // 背景颜色
    QColor m_colorBack = Qt::white;
    // 电池边框颜色
    QColor m_colorBoard = Qt::black;
    // 电池柱颜色
    QColor m_colorPower = Qt::green;
    // 电池短缺时的颜色
    QColor m_colorWaring = Qt::red;
    // 电池电量0~100
    int m_nPowerLevel = 60;
    // 电量低警示阈值
    int m_nWarnLevel = 20;
};

qmybattery.cpp文件

c++ 复制代码
#include "qmybattery.h"
#include<QPainter>
#include<QRect>
#include<QPen>
#include<QBrush>
#include<QString>
#include<QFont>
#include<QFontMetrics>


QMyBattery::QMyBattery(QWidget *parent)
    : QWidget{parent}
{

}

void QMyBattery::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
    QPainter painter(this);
    QRect rect(0,0,width(),height());
    // 设置视口大小
    painter.setViewport(rect);
    // 设置窗口大小
    painter.setWindow(0,0,120,50);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setRenderHint(QPainter::TextAntialiasing);
    // 绘制电池边框
    QPen pen;
    pen.setWidth(2);
    pen.setColor(m_colorBoard);
    pen.setStyle(Qt::SolidLine);
    pen.setCapStyle(Qt::FlatCap);
    pen.setJoinStyle(Qt::BevelJoin);
    painter.setPen(pen);
    QBrush brush;
    brush.setColor(m_colorBack);
    brush.setStyle(Qt::SolidPattern);
    painter.setBrush(brush);
    rect = QRect(1,1,109,48);
    painter.drawRect(rect);
    // 电池电极
    brush.setColor(m_colorBoard);
    painter.setBrush(brush);
    rect = QRect(110,15,10,20);
    painter.drawRect(rect);

    // 画电池柱
    if(m_nPowerLevel > m_nWarnLevel)
    {
        brush.setColor(m_colorPower);
        pen.setColor(m_colorPower);
    }
    else
    {
        brush.setColor(m_colorWaring);
        pen.setColor(m_colorWaring);
    }
    painter.setBrush(brush);
    painter.setPen(pen);

    if(m_nPowerLevel > 0 )
    {
        painter.drawRect(5,5,m_nPowerLevel,40);
    }

    // 绘制电量百分比
    QFontMetrics textSize(this->font());
    QString strPower = QString::asprintf("%d%%",m_nPowerLevel);
    rect = textSize.boundingRect(strPower);
    painter.setFont(this->font());
    pen.setColor(m_colorBoard);
    painter.setPen(pen);
    painter.drawText(55 - rect.width()/2,23 + rect.height()/2,strPower);
}


void QMyBattery::setCurPowerValue(int nValue)
{
    m_nPowerLevel = nValue;
    emit powerLevelChange(nValue);
    repaint();
}

int QMyBattery::powerLevel()
{
    return m_nPowerLevel;
}

void QMyBattery::setWarnLevel(int nValue)
{
    m_nWarnLevel = nValue;

}

int QMyBattery::warnLevel()
{
    return m_nWarnLevel;
}

QSize QMyBattery::sizeHint()
{
    int nH = this->height();
    int nW = nH*12/5;
    QSize size(nW,nH);
    return size;
}

2. 在Qt Designer中使用提升法

  1. 在Qt Designer中拖放一个基础控件(如QWidget)到你的窗体上。如下图:

  2. 右键点击该控件,选择"提升为..."

  3. 在弹出的对话框中:

    • 在"提升的类名称"中输入你的类名(如"MyCustomWidget")
    • 在"头文件"中输入包含该类的头文件(如"mycustomwidget.h")
  4. 点击"添加"按钮将其添加到提升的类列表中

  5. 点击"提升"按钮完成操作。

3. 构建项目

确保你的项目配置正确:

  • 在.pro文件中包含自定义控件的源文件和头文件
  • 确保头文件路径正确

上述代码运行效果如下:

另外:

高级用法

自定义属性

你可以在自定义控件中添加可在Qt Designer中编辑的属性:

C++ 复制代码
// 在头文件中
Q_PROPERTY(int customValue READ customValue WRITE setCustomValue)

public:
    int customValue() const;
    void setCustomValue(int value);

private:
    int m_customValue;

信号和槽

可以添加自定义信号和槽:

c++ 复制代码
signals:
    void valueChanged(int newValue);

public slots:
    void resetValue();

注意事项

  1. 命名规范:确保类名和头文件名匹配,遵循Qt命名约定
  2. 头文件路径:提升时指定的头文件路径应该是编译时的相对路径
  3. 基类选择:选择正确的基类进行继承,确保功能兼容
  4. UI文件:提升后的控件在.ui文件中会有特殊标记
  5. 多继承:如果需要多继承,确保第一个基类是QObject派生类

调试技巧

如果提升的控件不工作:

  • 检查是否包含正确的头文件
  • 确保类已正确注册到Qt元对象系统(有Q_OBJECT宏)
  • 查看编译输出是否有相关错误
  • 在代码中尝试直接创建该控件测试是否正常工作

提升法提供了一种简单的方式来扩展Qt标准控件,同时保持与Qt Designer的良好集成。

选择**:选择正确的基类进行继承,确保功能兼容

  1. UI文件 :提升后的控件在.ui文件中会有特殊标记

  2. 多继承:如果需要多继承,确保第一个基类是QObject派生类

调试技巧

如果提升的控件不工作:

  • 检查是否包含正确的头文件
  • 确保类已正确注册到Qt元对象系统(有Q_OBJECT宏)
  • 查看编译输出是否有相关错误
  • 在代码中尝试直接创建该控件测试是否正常工作

提升法提供了一种简单的方式来扩展Qt标准控件,同时保持与Qt Designer的良好集成。

相关推荐
小短腿的代码世界9 小时前
Qt Bluetooth源码深度解析:从HCI协议到跨平台API的完整架构
开发语言·qt·架构
小短腿的代码世界9 小时前
Qt WebEngine多进程架构与IPC通信:从Chromium多进程到Qt信号槽融合
qt·架构·系统架构
尘中远11 小时前
【Qwt 7.0 系列】快速入门与核心新特性概览 —— 更现代的 Qt 数据可视化库
qt·数据可视化·绘图·qwt·科学绘图
初阳78513 小时前
【Qt】系统相关(3)——多线程
qt
初阳78516 小时前
【Qt】系统相关(2)——文件
开发语言·qt
尘中远1 天前
【Qwt 7.0 系列】坐标轴与刻度系统 —— 刻度引擎、网格、图例与刻度朝内
qt·数据可视化·qcustomplot·qwt·工业软件·科学绘图
sycmancia1 天前
Qt——多线程间的互斥
开发语言·qt
尘中远2 天前
【Qwt 7.0 系列】常用图表类型实战 —— 柱状图、散点图、箱线图与直方图
qt·qwt·工业软件·科学绘图
尘中远2 天前
【Qwt 7.0 系列】交互功能详解 —— 平移、缩放、坐标轴交互与数据拾取
qt·数据可视化·绘图·qcustomplot·qwt·科学绘图
sycmancia2 天前
Qt——进程与线程的概念
qt