Qt自定义控件的实现与使用

前言

Qt已经提供了很多的基础控件供开发使用,而Qt原生的控件有时候并不能满足我们的需求,特别是在工业的运用上,比如我们需要一个日期时间的选择器,Qt虽然已经提供了原生的QDateTime控件,但这个原生控件并不能满足我们的需求,又比如我们需要实现类似微信左侧的消息列表,单纯的原生QListWidget(QListView)并不能完整的满足需求,这个时候我们就会寻找一种可以满足我们需求的控件。而Qt提供了自定义控件的功能,我们可以通过QtCreator自定义自己的控件,以满足业务的需求。下面我们看看如何使用QtCreator生成自定义控件。

自定义控件的创建

  1. 首先,如下图,我们创建一个Qt工程,工程选择Qt4设计师自定义控件。然后根据向导进行工程文件目录的选择。

在这里插入图片描述
2. 下一步中会选择自定义控件的类名称,如下图所示。
在这里插入图片描述
这儿有一点比较重要,需要注意:Qtdesigner设计师在拉控件的时候会默认使用控件名称的首字母小写作为创建的该控件的对象名,比如我们拖动了一个QPushButton控件,则Qtdesigner默认生成的对象的名称为pushButton,可以看出,对象名是直接将控件的名称首字母进行小写而来。因此我们在输入自定义控件名称的时候一定要首字母大写,否则在后续使用该自定义控件的时候会报错。

右侧的源文件tab下是该控件工程的源文件,图标文件的选项可以选填,这个主要是后续生成自定义控件时控件的图标,如果没有,则是Qt默认的原始图标,说明和默认属性tab下也可以选填。

  • 填写完成后,创建的工程项目如下图所示。
    在这里插入图片描述
    这个时候会发现,没有UI文件,而我们一般的控件都是可见的(也有不可见的),这样就面临着两种选择:
  • 使用代码手绘UI;
  • 将没有UI文件的工程修改为有UI文件的工程.

比较懒,所以我选择了第二种方式,毕竟Qt已经提供了直观的UI处理工具,为什么不用呢?那么怎样将工程修改为有UI文件的工程呢,有两种方法。

  • 直接删掉pri工程下面的控件类,然后重新添加新的Qt界面设计师类就行,这种方式比较简单粗暴,需要注意,新添加的类默认是在控件插件的工程下面即Pro文件下;
  • 新增一个UI文件,属于pri工程类,这个时候需要对该类进行修改,修改方式按照界面设计师类的方式修改就行,无非就是在头文件中增加namespace Ui{ class ***;} 增加私有成员变量ui。

无论是通过上述的哪一种方法增加了UI文件,都需要在头文件中包含头文件 #include <QtUiPlugin/QDesignerExportWidget>,在Qt版本5.7.0以下,可能是没有这个文件,需要包含#include <QtDesigner/QDesignerExportWidget>头文件,该头文件在5.7.0版本以上被弃用,在5.7.0版本中,打开QtDesigner/QDesignerExportWidget文件可以看到:

#if defined(__GNUC__)
#  warning Header <QtDesigner/QDesignerExportWidget> is deprecated. Please include <QtUiPlugin/QDesignerExportWidget> instead.
#elif defined(_MSC_VER)
#  pragma message ("Header <QtDesigner/QDesignerExportWidget> is deprecated. Please include <QtUiPlugin/QDesignerExportWidget> instead.")
#endif

此外,控件类名前必须添加宏:QDESIGNER_WIDGET_EXPORT 否则在后续使用该控件时编译会报错。如下图所示。
在这里插入图片描述
如上,我们基本上就已经完成一个自定义控件的编写,接下来我们需要进行对该控件工程进行编译,编译时选择release版本,debug版本可以编译通过,但在后续使用过程中发现在Qtdesigner中找不到,并且运行的时候会报错。
如果我们选择了新增一个UI文件的方式增加了UI,并且没有修改UI文件对象类名的话,编译时会报错,这是因为在只新增一个UI文件的时候,Qt默认了UI文件的名称为form.ui,其对象名为form,但是我们的构造函数中在new ui时 ui(new Ui::***),使用的是类名,报错找不到构造函数,如下图所示,此时我们只需要修改UI文件的对象名并重新qmake就行,因为ui_***.h文件需要重新生成。
在这里插入图片描述
至此,我们一个自定义的控件就算是创建完成了,如下图,将运行目录下面生成的***plugin.dll和***plugin.lib文件拷贝到Qt安装目录下,Qt5.7.0\5.7\msvc2013_64\plugins\designer,然后重新打开Qtdesigner设计师,创建UI文件,就能够在左侧拉入我们自定义的控件。
在这里插入图片描述

自定义控件的配置

首先以Qt安装目录C:\Qt\Qt5.7.0\5.7\msvc2013_64\为例说明下(一劳永逸的方法),

  • 复制生成的***plugin.dll文件到该目录下 bin/下;
  • 复制生成的***plugin.lib文件到该目录下 lib/下;
  • 新建文件夹,将***.h文件放进并将该文件夹复制到该目录下 include/下;
  • 复制生成的***plugin.dll文件到该目录下plugins/designer/下;

也可以新建工程的时候在每个新工程中添加,但是会比较麻烦。

自定义控件的使用

新建Qt项目,包含该自定义控件就能正常使用,如下图所示。下面我们主要看下Pro文件的写法。
在这里插入图片描述

新建工程,如下图方式,包含自定义控件的头文件已经静态链接库文件,如果没有进行上面的配置步骤,将***plugin.dll文件拷贝到该工程的运行目录下也是可以运行的,编译工程,运行。

#-------------------------------------------------
#
# Project created by QtCreator 2020-04-11T17:22:55
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = untitled3
TEMPLATE = app

LIBS += $$(QTDIR)/lib/datetimeplugin.lib
INCLUDEPATH  += $$(QTDIR)/include

SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

如上面,其中最主要的是下面这两行,其中的路径也可以自定义。

LIBS += $$(QTDIR)/lib/datetimeplugin.lib
INCLUDEPATH  += $$(QTDIR)/include

注意事项:

  • 如果需要将该控件集成到Qtcreator中使用,则编译的时候需要保持和QtCreator同样的编译版本,windows版本的QtCreator版本一般是MSVC的,就需要保证库的编译版本也是MSVC,并且版本号也是一样的,我的Qt版本是MSVC_2013,编译库时使用的是MSVC_2012,因此将该控件库文件拷贝进Qt5.7.0\Tools\QtCreator\bin\plugins\designer时在QtCreator中并不能找到自定义控件;
  • 前面提到过,自定义控件的类名称首字母一定要大写,因为会和默认生成的对象名称重复,编译时报错;
  • 类名称前加的宏一定不能忘记;
  • Qt版本不要弄错,因为Qt版本直接影响着头文件的引入.;
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值