要想在Qt Designer中使用自定义控件,必须要使Qt Designer能够知道我们的自定义控件的存在。有两种方法可以把新自定义控件的信息通知给Qt Designer:“升级(promotion)”法和插件法。
升级法最为简便快捷。顾名思义,升级法就是把Qt自有的控件进行升级改造一番。选一个Qt自有的控件,如果它和我们新加的自定义控件有着相似的API,那么只要在Qt Designer的对话框里面完成有关新控件的信息就一切大吉,新控件就可以用在Qt Designer创建的form中。但是在编辑和预览时,还是和Qt自有控件表示没有什么两样。
现在把HexSpinBox控件用升级方法插入到一个form中:
1.         用Qt Designer创建一个新的窗体,把控件箱里的QSpinBox添加到窗体中。
2.         右击spin box,选择“Promote to Custom Widget”上下文菜单。
3.         在弹出的对话框中,类名处填写“HexSpinBox”,头文件填写“hexspinbox.h”
好了。在uic生成的代码中包含有“hexspinbox.h”头文件而不是<QSpinBox>,还包含了一个HexSpinBox的实例,而不是QSpinBox。在Qt Designer中,HexSpinBox控件由QSpinBox表示,并且可以设置所有的QSpinBox的属性(如范围、当前值)。
升级法的缺点是不能在Qt Designer中设置自定义控件自己的特有属性,也不能够绘制自己。这些问题可以用插件法解决。
 
插件法需要创建一个插件库,使Qt Designer能够实时加载,用来创建控件的实例。这样,Qt Designer就可以在编辑窗体或者预览的时候使用自定义控件。因为有了Qt的meta-object系统,Qt Designer能动态获得自定义控件的全部属性。现在以IconEditor为例,用插件法把IconEditor集成到Qt Designer中。
首先,我们从QDesignerCustomWidgetInterface派生一个新类,重写一些虚函数。我们假定这个插件的源代码在iconeditorplugin目录中,IconEditor类的代码在与它平行的目录iconeditor中。
这里是插件类的定义:
  1. #include <QDesignerCustomWidgetInterface>
  2. class IconEditorPlugin : public QObject, public QDesignerCustomWidgetInterface
  3. {
  4. Q_OBJECT
  5. Q_INTERFACES(QDesignerCustomWidgetInterface)
  6. public:
  7. IconEditorPlugin(QObject *parent = 0);
  8. QString name() const;
  9. QString includeFile() const;
  10. QString group() const;
  11. QIcon icon() const;
  12. QString toolTip() const;
  13. QString whatsThis() const;
  14. bool isContainer() const;
  15. QWidget *createWidget(QWidget *parent);
  16. };
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 <i>C++ GUI "
  28. "Programming with Qt 4</i> 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()得到插件封装的特定控件的头文件,这个头文件包含在uic工具产生的代码中。
函数group()返回的是该自定义控件所属的工具箱(box group)的名字。如果Qt Designer中没有这个名字,就会为这个控件创建一个新的组别。
函数icon()返回自定义控件在Qt Designer中使用的图标。这里我们假设IconEditorPlugin有关联的资源文件,里面有一个图标编辑器图像的接口。
函数toolTip() 完成在Qt Designer的控件箱中,当鼠标移动到自定义控件时,显示字符串做为提示。
函数whatsThis()返回Qt Designer显示的“What’s This”提问。
函数isContainer()返回true说明这个控件可以包含其他控件。例如,QFrame可以包含其他控件,则它是一个容器控件。很多Qt控件都可以包含其他控件,但是如果isContainer()返回false,Qt Designer就不允许这个控件包含其他控件了。
Qt Designer调用函数createWidget()创建指定父控件的控件实例。
宏Q_EXPORT_PLUGIN2()必须在源文件的最后声明,这个宏使Qt Designer能够得到这个插件。第一个参数是这个插件的名字,第二个参数是实现这个插件类的名字。
.pro文件如下:
TEMPLATE        = lib
CONFIG         += designer plugin release
HEADERS         = ../iconeditor/iconeditor.h /
                  iconeditorplugin.h
SOURCES         = ../iconeditor/iconeditor.cpp /
                  iconeditorplugin.cpp
RESOURCES       = iconeditorplugin.qrc
DESTDIR         = $(QTDIR)/plugins/designer
.pro文件假定环境变量QTDIR位于Qt的安装目录。在运行make或者nmake编译插件后,程序自动它安装到Qt Designer的plugins目录中。安装成功后,我们就能象其他控件一样在Qt Designer中使用IconEditor控件了。

如果想在Qt Designer集成多个自定义控件,你可以为每个控件创建一个的插件,也可以把所有控件组合到一个插件中,从QDesignerCustomWidgetCollectionInterface派生。

 

把自定义控件集成到Qt Designer中的更多相关文章

  1. 自定义的插件如何加载到Qt Designer中(详细)

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

  2. 无法启动 Maya 集成的 qt designer 的解决方法和原因 以及 中英文切换

    无法启动 Maya 集成的 qt designer 的解决方法和原因 以及 中英文切换 前言: Maya 集成了 PySide,同时集成了qt designer,在 Maya 的安装目录下的 bin ...

  3. VS2008 Qt Designer 中自定义信号槽

    一.Qt Designer自定义槽函数 发现:在VS2008 +Qt4.7  中打开ui文件,所用的英文QT Designer工具,没有转到槽函数的功能,不如QtCreator自带的QtDesigne ...

  4. PyQt(Python+Qt)学习随笔:Qt Designer中部件的autoFillBackground属性

    autoFillBackground属性可以确认部件背景是否自动填充,如果自动填充,Qt会在调用Paint事件之前填充部件的背景.使用的颜色由部件调色板中的QPalette.window 角色定义(关 ...

  5. PyQt(Python+Qt)学习随笔:Qt Designer中部件的样式表styleSheet属性

    styleSheet属性是定义部件外观的属性样式表,在Qt中styleSheet样式表是类似于html的css样式一样的方法,只是时专门为Qt中的部件开发的.styleSheet的定义语法也是类似CS ...

  6. PyQt(Python+Qt)学习随笔:Qt Designer中部件的layoutDirection属性

    layoutDirection属性保存的是部件的布局方向,有三个取值: 在部件上设置布局方向时,它将传播到部件的子级,但不会传播到作为窗口的子级,也不会传播到已显式调用setLayoutDirecti ...

  7. PyQt(Python+Qt)学习随笔:Qt Designer中部件的accessibleDescription和accessibleName辅助阅读属性

    accessibleDescription和accessibleName属性都是用于残疾人辅助阅读的,这两个属性都有国际化属性(关于国际化请参考<PyQt(Python+Qt)学习随笔:Qt D ...

  8. PyQt(Python+Qt)学习随笔:Qt Designer中部件的toolTip、toolTipDuration、statusTip、whatsThis属性

    toolTip属性 toolTip属性设置部件的toolTip提示信息,toolTip提示信息在鼠标放到控件上会浮动出一个小框显示提示信息.默认情况下,仅显示活动窗口子部件的toolTip,可以通过在 ...

  9. PyQt(Python+Qt)学习随笔:Qt Designer中部件的是否接受鼠标拖放事件的acceptDrops属性及含义

    acceptDrops属性表示当前部件是否接受鼠标拖放事件,鼠标拖放应该是与鼠标拖拽结合在一起的,在Qt Designer中可以通过属性acceptDrops设置部件是否接受鼠标拖放事件.如果部件接受 ...

随机推荐

  1. JSONP跨域的原理

    一种脚本注入行为 在 2011年10月27日 那天写的     已经有 12671 次阅读了 感谢 参考或原文   服务器君一共花费了23.005 ms进行了2次数据库查询,努力地为您提供了这个页面. ...

  2. Multi-Channel MAC for Ad Hoc Networks: Handling Multi-Channel Hidden Terminals Using A Single Transceiver

    MAC协议 2004 这是一个单纯的Multi-Channel Ad Hoc场景,多信道,但不是DSA.没有PU,只是多信道利用问题,相对传统Ad Hoc,要解决的就是1)信道访问(如何使用多个信道) ...

  3. Linux APP源码级编译安装

    首先需要了解下tar包. 以下文章作出解释了: http://www.cnblogs.com/laipDIDI/articles/2214270.html http://baike.baidu.com ...

  4. Linux系统编程(20)——信号基本概念

    信号及信号来源 信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知 ...

  5. EMMA: 免费java代码测试覆盖工具

    From:http://emma.sourceforge.net/ EMMA: a free Java code coverage tool   Code coverage for free: a b ...

  6. poj 1077-Eight(八数码+逆向bfs打表)

    The 15-puzzle has been around for over 100 years; even if you don't know it by that name, you've see ...

  7. (续)一个demo弄清楚位图在内存中的存储结构

    本来续---数字图像处理之位图在计算机中的存储结构一文,通过参考别人的代码,进行修改和测试终于成功运行. 该实例未使用任何API和相关类,相信如果对此实例能够完全理解那么将有进一步进行数字图像处理的能 ...

  8. 网易云课堂_C++开发入门到精通_章节7:模板

    课时35类模板 类模板 创建类模板的实例 class Name<类型参数表>object; 类模板与模板类的区别 类模板是模板的定义,不是一个实实在在的类,定义中用到通用类型参数 模板类是 ...

  9. Mac 下纯lua(一)

    Lua 介绍 什么是lua - lua是一种跨平台开发脚本语言. Lua 历史 学校 University of Rio de Janeiro 国家 巴西 作者 Roberto Ierusalimsc ...

  10. Struts2(三)——数据在框架中的数据流转问题

    一款软件,无在乎对数据的处理.而B/S软件,一般都是用户通过浏览器客户端输入数据,传递到服务器,服务器进行相关处理,然后返回到指定的页面,进行相关显示,完成相关功能.这篇博客重点简述一下Struts2 ...