QT自定义控件及使用方法

Qt自带控件有时候不满足个性化的需求,需要自定义控件。如果自定义控件比较通用,最好在QT Designer下显示,以方便使用。最后介绍在Qt Creator中测试验证自定义控件。

Qt Creator编写自定义控件

在Qt Creator编写自定义控件可使用 “Qt4 设计师自定义控件” 模板工程,具体可参考:

需要注意的是:

  • 自定义控件的编译器应选择与编译生成Qt Creater应用的编译器相同。例如:在Windows平台,一般使用MSVC 32位编译器。当然可以不一定完全相同,例如MSVC 2015 32位编译器和MSVC 2017 32位编译器编译的自定义控件DLL可以通用。
  • 自定义控件类的声明中不需要使用 QDESIGNER_WIDGET_EXPORT 导出宏,否则后面使用自定义控件时将报错。

Qt Designer显示自定义控件

自定义控件编译链接后的Release目录中,将产生自定义控件的dll,将该dll拷贝至Qt Creator的插件目录,例如:

  • D:\Qt\Qt5.12.0\Tools\QtCreator\bin\plugins\designer

之后重启Qt Creator,创建Qt Widgets Application,打开Qt Designer,在其自定义窗口部件中即可发现自定义控件的图标。此外还需将自定义控件的头文件放到编译器的include目录,以msvc为例:

  • D:\Qt\Qt5.12.0\5.12.0\msvc2017\include\MyLabel\mylabel.h

Qt Creator测试自定义控件

打开Qt Creator,创建Qt Widgets Application 应用,打开Qt Designer,使用自定义控件,然后编译链接,将报如下错误:

1
mainwindow.obj:-1: error: LNK2019: 无法解析的外部符号 "public: __thiscall MyLabel::MyLabel(class QWidget *)" (??0MyLabel@@QAE@PAVQWidget@@@Z),该符号在函数 "public: void __thiscall Ui_MainWindow::setupUi(class QMainWindow *)" (?setupUi@Ui_MainWindow@@QAEXPAVQMainWindow@@@Z) 中被引用

其原因是没有将自定义控件包含到测试自定义控件的工程中。

  • 拷贝mylabel.h、mylabel.cpp、mylabel.pri到新建工程目录下,在新建工程pro文件中添加include(mylabel.pri)
  • 右键工程清除、执行qmake、重新构建应该就解决该编译链接错误了

参考链接

  1. Qt创建Qt Designer自定义控件及使用,by BrokenRainK.
  2. Qt Designer 插件测试报错问题,by 翻滚的雪球.
  3. QCalendarWidget - How to Highlight Dates,by stackoverflow.