一、创建插件

        1、创建一个Qt Designer Widget项目,选择Other Project -> Qt Custom Designer Widget(使用中文语言显示关于Qt4······)

        2、根据向导逐步创建 

                1)名称路径点击Next,查看Qt版本选择对应的套件(点击Help->about Creator,插件提供给Qt creator 17.0.0使用,构建套件应该选择MSVC2022,x86_64)

               2)选择套件,勾选Debug Release 

                3)设置插件属性,基类、图标文件、分组名称等。

                4)创建完成。

                pro:插件项目的项目文件,实现插件的接口。

                classname+plugin.h 和 classname+plugin.c:插件的头文件和源程序文件。

                qrc:资源文件,图标。

                classname.pri  是 USERBattery.pro项目中的一个项目文件,2.3图一勾选include project单选按钮所产生,用于管理自定义组件类USERBattery

                classname.h  classname.cpp自定义类的头文件和源程序文件,不设计直接放入对应文件,会显示分组和插件,但是插件界面为空白。


二、组件类内定义及部署

        1、头文件classname.h

        #include <QtUiPlugin/QDesignerExportWidget>为下面的宏的头文件。

        宏 QDESIGNER_WIDGET_EXPORT MyPBattery 用于将自定义组件类从插件导出给Qt creator使用,必须在类名称前使用此宏。

#ifndef MYPBATTERY_H
#define MYPBATTERY_H

#include <QWidget>
#include <QtUiPlugin/QDesignerExportWidget>
#include <QObject>
#include <QSize>
class QDESIGNER_WIDGET_EXPORT MyPBattery : public QWidget
{
    Q_OBJECT
    Q_PROPERTY(int pwerLevel READ powerLevel WRITE setPowerLevel NOTIFY powerLevelChanged);
    Q_PROPERTY(int warnLevel READ warnLevel WRITE setWarnLevel);
private:
    QColor colorBack=Qt::white;//背景色
    QColor colorBorder=Qt::black;//电池边框颜色
    QColor colorPower=::Qt::green;//电量柱颜色
    QColor colorWarning=Qt::red;//电量短缺颜色
    int m_powerLevel=60;//电量值为0~100,属性powerLevel的存储变量
    int m_warnWarning=20;//电量低阈值,属性warnLevel存储变量
protected:
    void paintEvent(QPaintEvent* event);//绘制组件并显示效果
public:
    explicit MyPBattery(QWidget *parent = nullptr);
    void setPowerLevel(int pow);//设置电量值
    int powerLevel();//返回电量值
    void setWarnLevel(int warn);//设置电量低阈值
    int warnLevel();//返回电量低阈值
    QSize sizeHint();//重定义的函数,设置组件的合适大小

signals:
    void powerLevelChanged(int);//自定义信号
};

#endif // MYPBATTERY_H

        2、源文件classname.cpp 

#include "mypbattery.h"
#include<QPaintEvent>
#include <QPainter>
#include <QPen>
#include <QBrush>
MyPBattery::MyPBattery(QWidget *parent) :
    QWidget(parent)
{
}
void MyPBattery::paintEvent(QPaintEvent *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(colorBorder);//画笔
    pen.setWidth(2);//线条宽度
    pen.setStyle(Qt::SolidLine);//线条样式:实线
    pen.setCapStyle(Qt::FlatCap);//线条端点样式:方形的线条端
    pen.setJoinStyle(Qt::BevelJoin);//线条连接样式:方钝脚
    painter.setPen(pen);
    QBrush brush;
    brush.setColor(colorBack);
    brush.setStyle(Qt::SolidPattern);
    painter.setBrush(brush);
    rect.setRect(1,1,109,48);//矩形左上角坐标(1,1),宽度=109,高度=48
    painter.drawRect(rect);
    brush.setColor(colorBorder);
    painter.setBrush(brush);
    //电池正极头
    rect.setRect(110,15,10,20);
    painter.drawRect(rect);

    //电量柱
    if(m_powerLevel>m_warnWarning)
    {
        brush.setColor(colorPower);
        pen.setColor(colorPower);
    }
    else
    {
        brush.setColor(colorWarning);
        pen.setColor(colorWarning);
    }
    painter.setBrush(brush);
    painter.setPen(pen);
    if(m_powerLevel>0)
    {
        rect.setRect(5,5,m_powerLevel,40);
        painter.drawRect(rect);
    }
    //绘制电池百分比
    QFontMetrics textSize(this->font());
    QString powstr=QString::asprintf("%d%%",m_powerLevel);
    QRect textRect=textSize.boundingRect(powstr);
    painter.setFont(this->font());
    pen.setColor(colorBack);
    painter.setPen(pen);
    painter.drawText(55-textRect.width()/2,23+textRect.height()/2,powstr);

    event->accept();
}

void MyPBattery::setPowerLevel(int pow)
{
    m_powerLevel=pow;
    emit powerLevelChanged(m_powerLevel);//发射信号
    repaint();//重绘
}

int MyPBattery::powerLevel()
{
    return m_powerLevel;
}

void MyPBattery::setWarnLevel(int warn)
{
    m_warnWarning=warn;
    repaint();
}

int MyPBattery::warnLevel()
{
    return m_warnWarning;
}

QSize MyPBattery::sizeHint()
{
    int H=this->height();
    int W=H*12/5;
    QSize size(W,H);
    return size;
}

         3、选择Release模式编译测试,将编译出来的文件复制到指定目录下

                1)编译后,打开目录,进入build文件 ,选择

                 2)复制.dll文件和lib文件(若在Debug模式下编译,会比当前这两个文件的文件名多一个字母"d")

                 3)将插件动态链接库文件复制,找到Qt根目录,放到以下两个目录(下面两个目录只放入dll即可)

                Qt\Tools\QtCreator\bin\plugins\designer

                Qt\6.9.1\msvc2022_64\plugins\designer

        4、重启软件,打开设计页面下拉,会找到插件位置及分组。

三、使用

        将插件动态链接库文件放入相应的目录中之后,打开Qt(或重启),构造套件选择同样版本,具有Debug,若插件使用的Release,勾选Release选项。

        1、点击编译,若出现C1083,则表示未添加lib文件,

                1)在项目文件夹新建一个目录,将插件的lib文件,右击项目选择Add Library ,选择External library,应用于Windows,只勾选Windows即可,Release不用勾选"Add "d" ······version"

        2、再次编译会出现······.exe-系统错误,由于找不到······.dll,无法执行代码。重新安装程序可能会解决此问题。

                1)解决,在上方External Library 添加dll文件步骤里面,找到Include path,将插件头文件以及插件的dll lib文件一起放入。

        3、再次编译运行:

       

四、安装后再次添加构造套件

        若没有匹配当前Qt版本构造套件,需要再次添加,例如我刚开始只有MSVC2019套件,但是Qt版本为17.0.0,MSVC2022,只能再次添加了。

        在搜索栏搜索Qt,安装的应用,找到Qt Maintenance Tool,选择添加或移除组件。之后按需添加就好了。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐