qt编写自定义控件插件路过的坑及注意事项

Qt项目一站式解决方案 Qt项目一站式解决方案     2022-08-18     256

关键词:

在一日一控件的口号下,终于写好了五十几个自定义控件,包括各种仪表盘,各种温度计,各种进度条,各种按钮等,具体可参见(http://www.cnblogs.com/feiyangqingyun/p/6128288.html)目前演示DEMO都是采用提升的方法来显示的,一直有个想法,想做成和QWT一样的可以直接编译集成到Qt Creator中,方便用户直接拖控件使用,即做成Qt Creator的插件,Qt要写Qt Creator的插件极为方便,和新建Qt Widget项目一样的步骤。方法可参见(http://blog.sina.com.cn/s/blog_a6fb6cc90102vsj1.html)以及系列文章(http://blog.csdn.net/giselite/article/category/1178493)。

 

Qt自定义插件注意事项:

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

2:自定义控件的名称不能小写,否则拖过去的控件自动生成的默认名称和类名一样,会编译通不过。这个问题坑了我很久,造成自动生成的UI代码保存,一直没有怀疑,后面才发现自动生成的代码类名和实例名称一样,冲突导致的。

3:自定义控件类头文件引入,Qt5.7以下版本为#include <QtDesigner/QDesignerExportWidget> 以上版本为#include <QtUiPlugin/QDesignerExportWidget>

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源码。

MINGW Qt Creator集成运行图

MSVC Qt Creator集成运行图

总结了一些Qt黑科技,欢迎大家及大神积极补充,谢谢。

1:当编译发现大量错误的时候,从第一个看起,一个一个的解决,不要急着去看下一个错误,往往后面的错误都是由于前面的错误引起的,第一个解决后很可能都解决了。
2:定时器是个好东西,学会好使用它,有时候用QTimer::singleShot可以解决意想不到的问题。
3:打开creator,在构建套件的环境中增加MAKEFLAGS=-j8,可以不用每次设置多线程编译。珍爱时间和生命。
4:如果你想顺利用QtCreator部署安卓程序,首先你要在AndroidStudio 里面配置成功,把坑全部趟平。
5:很多时候找到Qt对应封装的方法后,记得多看看该函数的重载,多个参数的,你会发现不一样的世界,有时候会恍然大悟,原来Qt已经帮我们封装好了。

6:可以在pro文件中写上标记版本号+ico图标
VERSION = 2018.7.25
RC_ICONS = main0.ico

7:管理员运行程序,限定在MSVC编译器。
QMAKE_LFLAGS += /MANIFESTUAC:\"level=\'requireAdministrator\' uiAccess=\'false\'\" #以管理员运行
QMAKE_LFLAGS += /SUBSYSTEM:WINDOWS,\"5.01\" #VS2013 在XP运行

8:运行文件附带调试输出窗口
CONFIG += console pro

9:绘制平铺背景QPainter::drawTiledPixmap
绘制圆角矩形QPainter::drawRoundedRect(),而不是QPainter::drawRoundRect();

10:移除旧的样式
style()->unpolish(ui->btn);
重新设置新的该控件的样式。
style()->polish(ui->btn);

11:获取类的属性
const QMetaObject *metaobject = object->metaObject();
int count = metaobject->propertyCount();
for (int i = 0; i < count; ++i) {
QMetaProperty metaproperty = metaobject->property(i);
const char *name = metaproperty.name();
QVariant value = object->property(name);
qDebug() << name << value;
}

12:Qt内置图标封装在QStyle中,大概七十多个图标,可以直接拿来用。
QStyle::SP_TitleBarMenuButton

13:根据操作系统位数判断加载
win32 {
contains(DEFINES, WIN64) {
DESTDIR = $${PWD}/../../bin64
} else {
DESTDIR = $${PWD}/../../bin32
}
}

14:Qt5增强了很多安全性验证,如果出现setGeometry: Unable to set geometry,请将该控件的可见移到加入布局之后。

15:可以将控件A添加到布局,然后控件B设置该布局,这种灵活性大大提高了控件的组合度,比如可以在文本框左侧右侧增加一个搜索按钮,按钮设置图标即可。
QPushButton *btn = new QPushButton;
btn->resize(30, ui->lineEdit->height());
QHBoxLayout *layout = new QHBoxLayout(ui->lineEdit);
layout->setMargin(0);
layout->addStretch();
layout->addWidget(btn);

16:对QLCDNumber控件设置样式,需要将QLCDNumber的segmentstyle设置为flat。

17:巧妙的使用findChildren可以查找该控件下的所有子控件。findChild为查找单个。
//查找指定类名objectName的控件
QList<QWidget *> widgets = parentWidget.findChildren<QWidget *>("widgetname");
//查找所有QPushButton
QList<QPushButton *> allPButtons = parentWidget.findChildren<QPushButton *>();
//查找一级子控件,不然会一直遍历所有子控件
QList<QPushButton *> childButtons = parentWidget.findChildren<QPushButton *>(QString(), Qt::FindDirectChildrenOnly);

18:巧妙的使用inherits判断是否属于某种类。
QTimer *timer = new QTimer; // QTimer inherits QObject
timer->inherits("QTimer"); // returns true
timer->inherits("QObject"); // returns true
timer->inherits("QAbstractButton"); // returns false

19:使用弱属性机制,可以存储临时的值用于传递判断。

20:在开发时, 无论是出于维护的便捷性, 还是节省内存资源的考虑, 都应该有一个 qss 文件来存放所有的样式表, 而不应该将 setStyleSheet 写的到处都是。

21:如果出现Z-order assignment: " is not a valid widget.错误提示,用记事本打开对应的ui文件,找到<zorder></zorder>为空的地方,删除即可。

22:善于利用QComboBox的addItem的第二个参数设置用户数据,可以实现很多效果,使用itemData取出来。

23:如果用了webengine模块,发布程序的时候带上QtWebEngineProcess.exe+translations文件夹+resources文件夹。

24:a.setAttribute(Qt::AA_NativeWindows);可以让每个控件都拥有独立的句柄。

25:Qt+Android防止程序被关闭。
#if defined(Q_OS_ANDROID)
QAndroidService a(argc, argv);
return a.exec()
#else
QApplication a(argc, argv);
return a.exec();
#endif

26:可以对整体的指示器设置样式,例如 *::down-arrow,*::menu-indicator{} *::up-arrow:disabled,*::up-arrow:off{}。

27:可以执行位置设置背景图片。
QMainWindow > .QWidget {
background-color: gainsboro;
background-image: url(:/images/pagefold.png);
background-position: top right;
background-repeat: no-repeat
}

28:嵌入式linux运行Qt程序 Qt4写法:./HelloQt -qws & Qt5写法:./HelloQt --platform xcb
29:Qtcreator软件的配置文件存放在:C:\Users\Administrator\AppData\Roaming\QtProject,有时候如果发现出问题了,将这个文件夹删除后打开creator自动重新生成即可。
30:QMediaPlayer依赖本地解码器,WIN上下载k-lite或者LAV Filters安装即可。
31:代码判断MSVC编译器版本,if (_MSC_VER == 1800),对应关系2013=1800 2012=1700 2010=1600 2008=1500 2005=1400
32:在pro中判断不同平台:message($$QT_ARCH) contains(QT_ARCH,arm)。
33:Qt最小化后恢复界面假死冻结,加上代码
void showEvent(QShowEvent *e){
setAttribute(Qt::WA_Mapped);
QWidget::showEvent(e);
}
34:获取标题栏高度:style()->pixelMetric(QStyle::PM_TitleBarHeight); PM_TitleBarHeight点进去你会发现新大陆。

96:崩溃的80%都是因为要么越界,要么未初始化,死扣这两点,80%的问题解决了。
97:我一般保留四个版本,为了兼容qt4用4.8.7, 最后的支持XP的版本5.7.0, 最新的长期支持版本5.9.7 最高的新版本比如5.12。
98:看qt源码的网站:https://code.woboq.org/qt5/
99:终极秘籍:如果遇到问题搜索Qt方面找不到答案,试着将关键字用JAVA C# android打头,你会发现别有一番天地,其他人很可能做过!
100:最后一条:珍爱生命,远离编程。

Qt界的中文乱码问题,版本众多导致的如何选择安装包问题,如何打包发布程序的问题,堪称Qt界的三座大山!
qml播放视频在linux需要安装 sudo apt-get install libpulse-dev

qt编写自定义控件21-圆弧仪表盘(代码片段)

一、前言圆弧仪表盘在整个自定义控件大全中也稍微遇到了技术难点,比如背景透明,如果采用以前画圆形画扇形的方式绘制,肯定很难形成背景透明,需要用到切割,最后换了一种绘制方法,采用绘制圆弧的方式,即使用drawAr... 查看详情

qt编写自定义控件属性设计器

以前做.NET开发中,.NET直接就集成了属性设计器,VS不愧是宇宙第一IDE,你能够想到的都给你封装好了,用起来不要太爽!因为项目需要自从全面转Qt开发已经6年有余,在工业控制领域,有一些应用场景需要自定义绘制一些控件... 查看详情

qt编写自定义控件大全

最新版可执行文件 http://pan.baidu.com/s/1i491FQP不定期增加控件及修正BUG和改进算法。总图:1:动画按钮 *1:可设置显示的图像和底部的文字 *2:可设置普通状态图片 *3:可设置进入状态图片 *4:可设置离开状态图片&nbs... 查看详情

qt编写自定义控件20-自定义饼图(代码片段)

前言上次在写可视化数据大屏电子看板项目的时候,为了逐步移除对QChart的依赖(主要是因为QChart真的太垃圾了,是所有Qt的模块中源码最烂的一个,看过源码的人没有一个不吐槽,不仅不支持10W级别的数据量曲线展示,居然一... 查看详情

qt编写自定义控件25-自定义qcustomplot(代码片段)

一、前言上次在写大屏数据可视化电子看板系统时候,提到过改造QCustomPlot来实现柱状分组图、横向柱状图、横向分组图、鼠标悬停提示等。这次单独列出来描述,有很多人疑问为啥不用QChart,或者echart等形式,其实这两种方式... 查看详情

qt编写自定义控件24-图片轮播控件(代码片段)

一、前言上一篇文章写的广告轮播控件,采用的传统widget堆积设置样式表做的,这次必须要用到更高级的QPainter来绘制了,这个才是最高效的办法,本控件参考雨田哥的轮播控件,经过大规模的改造而成,相比于原来的广告轮播... 查看详情

qt编写自定义控件13-多态进度条(代码片段)

前言多态进度条,顾名思义,有多重状态,其实本控件主要是用来表示百分比进度的,由于之前已经存在了百分比进度条控件,名字被霸占了,按照先来先得原则,只好另外取个别名叫做多态进度条,应用场景是,某种任务有三... 查看详情

qt编写自定义控件23-广告轮播控件(代码片段)

一、前言广告轮播这个控件做的比较早,是很早以前定制一个电信客户端时候用到的,该客户端需要在首页展示轮播预先设定好的图片,图片的路径可以自由设定,然后轮播的间隔速度可以自由控制,同时该控件还需要提供两种... 查看详情

qt编写自定义控件:左上角圆形菜单控件(代码片段)

代码:#ifndefROUNDMMENUINUPPERLEFTCORNERWIDGET_H#defineROUNDMMENUINUPPERLEFTCORNERWIDGET_H#include<QWidget>#include<QTimer>#include<QPainterPath>classRoundMmenuInUpperLeftCornerWidget:publicQWidgetQ_OBJECTpublic:RoundMmenuInUpperLeftCornerWidget(QWidget*parent=nullptr);... 查看详情

qt编写自定义控件22-蚂蚁线(代码片段)

一、前言关于蚂蚁线控件,相信很多用过PS的人都知道,在选中某个区域以后,边上的线条会有一种动态流动的效果,这种效果就叫做蚂蚁线,百科的解释是:动物的一种本能现象,领头的蚂蚁以随机的路线走向食物或洞穴,第... 查看详情

qt编写自定义控件14-环形进度条(代码片段)

前言环形进度条,用来展示当前进度,为了满足大屏UI的需要特意定制,以前有个叫圆环进度条,不能满足项目需要,只能重新定做,以前的进度间距不能自适应分辨率,而且当前进度对应的反的进度不能单独设置颜色,即当前... 查看详情

qt编写导航按钮

...或者导航菜单,参照过各种各样的主界面导航布局,特意编写导航按钮自定义控件,结合各种情况,继承自QPushButton。已集成在QUC自定义控件中。/***导航按钮控件作者:feiyangqingyun(QQ:517216493)2017-12-19*1:可设置文字的左侧+右侧+顶部+... 查看详情

qt编写自定义控件15-百分比仪表盘(代码片段)

前言百分比仪表盘,主要的应用场景是展示销售完成率、产品合格率等,也可以作为一个进度百分比展示,可以独立设置对应的标题文字,标题文字的颜色和整体的颜色都可以单独设置,建议设置成统一的风格,这样会显得更加... 查看详情

qt系列——qt5自定义控件(插件)封装sdk集成到qtdesigner和qtcreaterframework中(代码片段)

...等参数属性。下面就以此为例,讲解一下如何创建自定义的窗体控件。一、效果展示为了直观显示本文章的意图,我们将制作后的自定义插件直观显示下面讲解对应的自定义控件集成过程。二、创建Qt设计师自定义控件打... 查看详情

qt系列文章之三十六(自定义qtdesigner插件)

...ryDesignerPlugin.pro的内容内置项目mybattery.pri组件类MyBattery的定义插件的编译与安装使用自定义插件使用MSVC编译器输出中文的问题运行效果图demo下载前言  上节讲了如何自定义一个QWidget组件,然后提升为QWidget控件来 查看详情

qt系列文章之三十六(自定义qtdesigner插件)

...ryDesignerPlugin.pro的内容内置项目mybattery.pri组件类MyBattery的定义插件的编译与安装使用自定义插件使用MSVC编译器输出中文的问题运行效果图demo下载前言  上节讲了如何自定义一个QWidget组件,然后提升为QWidget控件来 查看详情

qt编写自定义控件70-扁平化flatui(代码片段)

一、前言对于现在做前端开发人员来说,FlatUI肯定不陌生,最近几年扁平化的设计越来越流行,大概由于现在PC端和移动端的设备的分辨率越来越高,扁平化反而看起来更让人愉悦,而通过渐变色产生的质感色彩反而没有扁平化... 查看详情

qt编写自定义控件68-ip地址输入框(代码片段)

一、前言这个IP地址输入框控件,估计写烂了,网上随便一搜索,保证一大堆,估计也是因为这个控件太容易了,非常适合新手练手,一般的思路都是用4个qlineedit控件拼起来,然后每个输入框设置正则表达式过滤只能输入3位数... 查看详情