1、参考:Qt之实现自定义控件的两种方式——提升法
2、概述:自定义控件是常需要使用到的技能,在既有的Qt控件不能满足开发的前提下,自定义控件给了程序员很多的发挥空间和便利。自定义控件有两种方式,一种是通过提升法来实现,另一种是通过插件形式来实现。结合上述的参考网址和我自己的测试情况,自定义控件的提升法主要步骤是:
a.创建及绘制:创建一个带ui的自定义Qt类,继承自QWidget,在Ui上绘制或者通过重载void paintEvent(QPaintEvent *event)绘制需要的图形;
b. 提升:绘制完毕后,通过QtCreator的设计界面找到控件并进行提升为自定义的控件类;
c. 使用:创建一个新的ui类,在QtCreator的设计界面新建一个QWidget控件,将其提升为自定义控件类。
2.1、创建及绘制
新建一个Qt的界面项目,使用QWidget类作为主界面,再增加一个MyBattery的UI类,继承自QWidget类,然后重载void paintEvent(QPaintEvent *event)函数,在里面进行绘制的操作。
2.2 、提升
在设计师中打开mybattery.ui,找到控件QWidget-电池的绘制对象,右键->提升,在提升的界面中,增加MyBattery提升上,注意继承自QWidget,与之前的保持一致。添加后,再点击提升。
2.3 、在创建该工程时,我们已经有一个QWidget类了,在设计师中打开widget.ui,拖一个QWidget控件对象,右键->提升为MyBattery,即可。
2.4 运行结果
3、github代码地址
4、可能出现的问题:
E:\QtTest\build-untitled7-MyBattery-Desktop_Qt_5_15_2_MinGW_64_bit-Debug\ui_mybattery.h:31: error: expected type-specifier before ‘MyBattery’
In file included from …\untitled7-MyBattery\mybattery.cpp:2:
./ui_mybattery.h: In member function ‘void Ui_MyBattery::setupUi(QWidget*)’:
./ui_mybattery.h:31:22: error: expected type-specifier before ‘MyBattery’
widget = new MyBattery(MyBattery);
这个问题的可能原因是:自定义控件被反复取消或者删除再重新添加,导致另一个界面中已经提升的QWidget类对象没有被同步,需要取消提升再添加提升。