Qt 插件初体验1--->一个自定义按钮插件

Qt 插件初体验1--->一个自定义按钮插件,第1张

自定义按钮插件
    • 为什么要自定义按钮插件
    • qt开发环境
    • 创建Qt子项目开发工程
      • 添加一个Qt 设计是自定义控件
      • 添加测试插件代码工程子项目
    • 自定义按钮开发
      • 添加资源文件-->按钮图标
      • 代码开发
      • 将插件集成的qt IDE中
    • 插件开发过程中测试
    • 注意事项

为什么要自定义按钮插件

单的设计出自己想要的效果,比如拖拽按钮,文本编辑器、图表等,可以不用重复实现这些功能。


由于Qt Designer里的控件是官方提供的,但是有时为了美观或者特殊功能,需要开发我们自己的控件,这就需要自定义开发了。



使用ICON图标来设计美化按钮控件,使用Qwidget和QPainter绘制,不继承QButton类。


通过这种方式实现按钮有很好的兼容性,同时可以更加不同的场景实现不同的效果。


带给使用者不一样的体验,改善界面的美观。


qt开发环境

·1、使用的qt5.15.2版本+MSVC 2019 64位2、为了方便测试和验证控件是否开发正确,使用子项目的开发方式

创建Qt子项目开发工程

打开Qt Creater ,创建一个qt 子目录项目。



添加一个Qt 设计是自定义控件

创建完子项目工程,会自动d出一个新建子项目–>选择其他项目–> qt 设计师自动控件;根据向导填写项目名称和自定义控件类;填写完后一路绿灯下一步。





添加测试插件代码工程子项目

在项目上右键–>新子项目,添加一个Qt Widgets Application应用程序。



Qt工程目录如下:

自定义按钮开发 添加资源文件–>按钮图标

代码开发

在leostartbutton目录下修改对应文件的代码:

修改头文件leostartbutton.h

#include 

class LeoStartButton : public QWidget
{
    Q_OBJECT

public:
    explicit LeoStartButton(QWidget *parent = 0);
protected:
    void paintEvent(QPaintEvent *ev) Q_DECL_OVERRIDE; // 重写 paintEvent ,这是将图标重新绘制
    void mousePressEvent(QMouseEvent *ev) Q_DECL_OVERRIDE; // 重写鼠标事件处理方法,根据鼠标按键来触发对应的 *** 作
    void mouseReleaseEvent(QMouseEvent *ev) Q_DECL_OVERRIDE; //重写鼠标释放事件处理方法,暂时未使用,需要可以自己添加
signals:
    void toggled();
private:
    bool m_bPressed = false; //鼠标左键按钮是否点击
    QPixmap m_pixmapStart,m_pixmapStop;//按钮的两种形式
};

修改源文件leostartbutton.cpp

#include "leostartbutton.h"
#include 
#include 
#include 
#define ICON_START ":/img/start-96.png"
#define ICON_STOP ":/img/stop-96.png"

LeoStartButton::LeoStartButton(QWidget *parent) :
    QWidget(parent)
{
    m_pixmapStart.load(ICON_START);
    m_pixmapStop.load(ICON_STOP);
}

void LeoStartButton::paintEvent(QPaintEvent *ev)
{
    QPainter painter(this);
    if(m_bPressed)
    {
        resize(m_pixmapStop.size());
        painter.drawPixmap(0,0,m_pixmapStop);
    }
    else
    {
        resize(m_pixmapStart.size());
        painter.drawPixmap(0,0,m_pixmapStart);
    }
}

void LeoStartButton::mousePressEvent(QMouseEvent *ev)
{
    if( ev->button() == Qt::LeftButton)
    {
        if(m_bPressed)
        {
            m_bPressed = false;
        }
        else
        {
            m_bPressed = true;
        }
        this->update(); //此处必须update,不然不会更新显示
    }

}

void LeoStartButton::mouseReleaseEvent(QMouseEvent *ev)
{

}

到这就可以编译,生成插件了,最好使用release模式下生成。


将插件集成的qt IDE中

在生成的目录中找到 leostartbuttonplugin.dll 文件,将该文件放到qt designer 和 qt creator 目录下中
Qt designer 路径: D:\Qt\5.15.2\msvc2019_64\plugins\designer;
Qt Creator 路径: D:\Qt\Tools\QtCreator\bin\plugins\designer;

就可以在Qt ide的设计中查看到自己的插件:

插件开发过程中测试

1、开发时如果每次都生成一个插件库,然后在加载,这样比较麻烦,也会消耗很多的时间,所以本工程在建立时,建立了一个测试工程,这样就可以快速的进行调试验证。


具体参考源码https://gitee.com/liqiuhua/qt-plug-in-learning。


2、也可以直接加载控件来进行调试,目前还没有测试完成,之后再更新。


注意事项

以下注意事项是从网友那引用过来,前人栽树,后人乘凉。



感谢谢博客园–宝贝皮的Qt编写自定义控件及插件的使用

1:每个Qt库bin目录的designer可执行文件都是和该库同一个编译器编译的,可用,如果想要集成到Qt Creator中,则需要注意版本,一般在windows上的Qt Creator版本是MSVC的,则需要对应的Qt库也是MSVC编译的,库版本和编译器版本必须保持一致才能是顺利集成到Qt Creator的重要前提。


2:自定义控件的名称不能小写,否则拖过去的控件自动生成的默认名称和类名一样,会编译通不过。


这个问题坑了我很久,造成自动生成的UI代码保存,一直没有怀疑,后面才发现自动生成的代码类名和实例名称一样,冲突导致的。


3:自定义控件类头文件引入,Qt5.7以下版本为

#include  

以上版本为

#include 

4:类名前必须加入 QDESIGNER_WIDGET_EXPORT 宏。


否则集成到Qt Creator 中编译会报错。


不加的话可以在设计器中加载,但是编译会报错。


5:如果将生成好的dll文件放到Qt库目录下的 plugins\designer 下,可以在 designer 中看到。


放到Qt Creator下的 bin\plugins\designer 则可以集成到Qt Creator中。


6:将自定义控件的头文件、dll文件、lib(mingw编译器为.a)文件复制出来,放到include(可自己随便命名,我这里习惯用include)目录,将include目录放到项目的源码文件下,在使用了自定义控件的项目的pro文件中,增加两行

INCLUDEPATH += $$PWD/include   
LIBS += $$PWD/include/***.lib(mingw编译器为.a) 

这样可以正常编译,但是编译完成后不能运行,还需要将 对应自定义控件的dll文件复制到可执行文件同一目录即可,至此大功告成。


番外话:大部分文章介绍都是将对应的库文件和头文件放到Qt安装目录对应文件夹下,为什么这里要放到一个include目录,随着项目一起呢?个人是这么理解的,随项目一起,每次都可以很方便的将运行库文件复制到可执行文件同一目录,而不会忘记从Qt库对应目录找该运行库。


而且发布代码的时候也可以有个很好的参考。


7:官网提供的Qt Creator版本基本上是MSVC版本,如果需要在mingw的Qt库对应的Qt Creator中集成自定义控件,需要自己用对应的Qt库编译Qt Creator源码。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/579471.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-11
下一篇 2022-04-11

发表评论

登录后才能评论

评论列表(0条)

保存