- 为什么要自定义按钮插件
- qt开发环境
- 创建Qt子项目开发工程
- 添加一个Qt 设计是自定义控件
- 添加测试插件代码工程子项目
- 自定义按钮开发
- 添加资源文件-->按钮图标
- 代码开发
- 将插件集成的qt IDE中
- 插件开发过程中测试
- 注意事项
单的设计出自己想要的效果,比如拖拽按钮,文本编辑器、图表等,可以不用重复实现这些功能。
由于Qt Designer里的控件是官方提供的,但是有时为了美观或者特殊功能,需要开发我们自己的控件,这就需要自定义开发了。
使用ICON图标来设计美化按钮控件,使用Qwidget和QPainter绘制,不继承QButton类。
通过这种方式实现按钮有很好的兼容性,同时可以更加不同的场景实现不同的效果。
带给使用者不一样的体验,改善界面的美观。
·1、使用的qt5.15.2版本+MSVC 2019 64位2、为了方便测试和验证控件是否开发正确,使用子项目的开发方式
创建Qt子项目开发工程打开Qt Creater ,创建一个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模式下生成。
在生成的目录中找到 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源码。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)