Qt 创建自定义部件集成到Qt Designer中
创始人
2024-08-01 06:30:44
0次

Qt Designer为程序员提供了可视化的设计能力,可用于开发应用程序中的所有或者部分窗体。交叉编译呢,简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。

把自定义控件集成到Qt Designer中

要想在Qt Designer中使用自定义控件,必须要使Qt Designer能够知道我们的自定义控件的存在。有两种方法可以把新自定义控件的信息通知给Qt Designer:“升级”法和插件法。

升级法最为简便快捷。顾名思义,升级法就是把Qt自有的控件进行升级改造一番。找一个Qt自有的控件,如果它和我们新加的自定义控件有着相似的API,那么只要在Qt Designer的对话框里面完成一些新控件的信息就一切大吉,新控件就可以在Qt Designer中使用了。但是在编辑的时候和预览时,还是和原来的Qt控件没有什么两样。

现在把HexSpinBox控件用升级方法集成到Qt Designer中:

1、用Qt Designer创建一个新的窗体,把控件箱里的QSpinBox添加到窗体中。

2、右击旋转盒,选择“Promote to Custom Widget”上下文菜单。

3、在弹出的对话框中,类名处填写“HexSpinBox”,头文件填写“hexspinbox.h”

好了。在uic生成的包含有QSpinBox的控件文件中,包含文件变为“hexspinbox.h”,并且初始化为一个HexSpinBox的实例,而不是QSpinBox。在Qt Designer中,QSpinBox表示的控件为HexSpinBox,并且可以设置所有的QSpinBox的属性。

Figure 5.6. Qt Designer's custom widget dialog 
  
升级法的缺点是不能在Qt Designer中设置自定义控件自己的特有属性,也不能够绘制自己。这些问题可以用插件法解决。

插件法需要创建一个动态库,使Qt Designer能够在实时加载,创建控件的实例。这样,Qt Designer就可以在编辑窗体或者预览的时候使用自定义控件。Qt Designer用Qt的meta-object系统动态获得自定义控件的全部属性。现在以IconEditor为例,用插件法把IconEditor集成到Qt Designer中。

首先,我们从QDesignerCustomWidgetInterface继承一个类,重写一些虚函数。我们假定这个类的源代码在iconeditorplugin目录中,IconEditor类的代码在与它平行的目录iconeditor中。
这里是插件类的定义:

  1. #include  
  2.  
  3. class IconEditorPlugin : public QObject, public QDesignerCustomWidgetInterface  
  4. {  
  5.     Q_OBJECT  
  6.     Q_INTERFACES(QDesignerCustomWidgetInterface)  
  7. public:  
  8.     IconEditorPlugin(QObject *parent = 0);  
  9.     QString name() const;  
  10.     QString includeFile() const;  
  11.     QString group() const;  
  12.     QIcon icon() const;  
  13.     QString toolTip() const;  
  14.     QString whatsThis() const;  
  15.     bool isContainer() const;  
  16.     QWidget *createWidget(QWidget *parent);  
  17. }; 

IconEditorPlugin是一个包装IconEditor控件的类厂,使用了双继承,父类为QObject和QDesignerCustomWidgetInterface。宏Q_INTERFACES()告诉moc第二个基类为一个插件接口类。Qt Designer使用类中的函数创建IconEditor的实例并得到有关它的信息。

源文件如下:

  1. IconEditorPlugin::IconEditorPlugin(QObject *parent)  
  2.     : QObject(parent)  
  3. {  
  4. }  
  5. QString IconEditorPlugin::name() const  
  6. {  
  7.     return "IconEditor";  
  8. }  
  9. QString IconEditorPlugin::includeFile() const  
  10. {  
  11.     return "iconeditor.h";  
  12. }  
  13. QString IconEditorPlugin::group() const  
  14. {  
  15.     return tr("Image Manipulation Widgets");  
  16. }  
  17. QIcon IconEditorPlugin::icon() const  
  18. {  
  19.     return QIcon(":/images/iconeditor.png");  
  20. }  
  21. QString IconEditorPlugin::toolTip() const  
  22. {  
  23.     return tr("An icon editor widget");  
  24. }  
  25. QString IconEditorPlugin::whatsThis() const  
  26. {  
  27.     return tr("This widget is presented in Chapter 5 of C++ GUI "  
  28.               "Programming with Qt 4 as an example of a custom Qt "  
  29.               "widget.");  
  30. }  
  31. bool IconEditorPlugin::isContainer() const  
  32. {  
  33.     return false;  
  34. }  
  35. QWidget *IconEditorPlugin::createWidget(QWidget *parent)  
  36. {  
  37.     return new IconEditor(parent);  
  38. }   
  39. Q_EXPORT_PLUGIN2(iconeditorplugin, IconEditorPlugin) 

构造函数是一个空函数

函数name()返回控件的名称。

函数includeFile()得到控件的头文件,这个头文件包含在moc产生的代码中

函数group()返回的是控件所属的工具箱的名字。如果Qt Designer中没有这个名字,就会为这个控件创建一个新的组别。

函数icon()返回控件在Qt Designer中用的图标。这里我们假设IconEditorPlugin有关联的资源文件,里面有一个图标编辑器的图像。

在Qt Designer的控件箱中,当鼠标移动到自定义控件时,显示toolTip()返回的字符串做为提示。

函数whatsThis()返回Qt Designer显示的“What’s This”提问。

函数isContainer()返回true说明这个控件可以包含其他控件。例如,QFrame可以包含其他控件,则它是一个容器控件。很多Qt控件都可以包含其他控件,但是如果isContainer()返回false,Qt Designer就不允许这个控件包含其他控件了。

Qt Designer调运函数createWidget()创建控件实例,指定父控件。

宏Q_EXPORT_PLUGIN2()必须在源文件的最后声明,这个宏使Qt Designer能够得到这个插件。第一个参数是这个插件的名字,第二个参数是实现这个插件类的名字。

.pro文件如下:

  1. TEMPLATE        = lib   
  2. CONFIG         += designer plugin release   
  3. HEADERS         = ../iconeditor/iconeditor.h \   
  4.                   iconeditorplugin.h   
  5. SOURCES         = ../iconeditor/iconeditor.cpp \   
  6.                   iconeditorplugin.cpp   
  7. RESOURCES       = iconeditorplugin.qrc   
  8. DESTDIR         = $(QTDIR)/plugins/designer  

.pro文件假定QTDIR位于Qt的安装目录。在运行make或者nmake后,程序自动它安装到Qt Designer的插件目录中。安装成功后,我们就能象其他控件一样在Qt Designer中使用它了 。如果想在Qt Designer集成多个控件,你可以为每个控件创建一个上面装佯的插件库,也可以使用QDesignerCustomWidgetCollectionInterface一次性创建。

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
只需三步,让你掌握阿尔法路由器... 请参照以下阿尔法路由器设置方法,通过浏览器进入及设置宽带路由器。经过这三个步骤的设置,基本上能够熟悉...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何更省钱? 近期特价热门硒鼓... 如今激光打印设备已经成为商务或企业的绝对主力办公设备,但采购者往往忽视了激光打印设备所用的耗材,相对...