QT学习教程(二十三)

把自定义控件集成到 Qt Designer 中(Integrating Custom Widgets with 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 的属性。

升级法的缺点是不能在Qt Designer 中设置自定义控件自己的特有属性,也不能够绘制自己。这些问题可以用插件法解决。插件法需要创建一个动态库,使 Qt Designer 能够在实时加载,创建控件的实例。这样,Qt Designer 就可以在编辑窗体或者预览的时候使用自定义控件。Qt Designer 用Qt 的meta- object 系统动态获得自定义控件的全部属性。现在以 IconEditor 为例,用插件法把 IconEditor集成到Qt Designer 中。首先,我们从QDesignerCustomWidgetInterface 继承一个类,重写一些虚函数。我们假定这个类的源代码在iconeditorplugin 目录中,IconEditor 类的代码在与它平行的目录 iconeditor 中。

#include <QDesignerCustomWidgetInterface>
class IconEditorPlugin : public QObject, public QDesignerCustomWidgetInterface
{
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetInterface) public:
IconEditorPlugin(QObject *parent = 0); QString name() const;
QString includeFile() const; QString group() const; QIcon icon() const; QString toolTip() const; QString whatsThis() const; bool isContainer() const;
QWidget *createWidget(QWidget *parent);
};

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

IconEditorPlugin::IconEditorPlugin(QObject *parent)
: QObject(parent)
{
}
QString IconEditorPlugin::name() const
{
return "IconEditor";
}
QString IconEditorPlugin::includeFile() const
{
return "iconeditor.h";
}
QString IconEditorPlugin::group() const
{
return tr("Image Manipulation Widgets");
}
QIcon IconEditorPlugin::icon() const
{
return QIcon(":/images/iconeditor.png");
}
QString IconEditorPlugin::toolTip() const
{
return tr("An icon editor widget");
}
QString IconEditorPlugin::whatsThis() const
{
return tr("This widget is presented in Chapter 5 of <i>C++ GUI " "Programming with Qt 4</i> as an example of a custom Qt " "widget.");
}
bool IconEditorPlugin::isContainer() const
{
return false;
}
QWidget *IconEditorPlugin::createWidget(QWidget *parent)
{
return new IconEditor(parent);
}
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 文件如下:
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 的插件目录中。安装成功后,我们就能象其他控件一样在 Qt Designer 中使用它了

如果想在Qt Designer 集成多个控件,你可以为每个控件创建一个上面装佯的插件库,也可以使用QDesignerCustomWidgetCollectionInterface 一次性创建。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随风逐流wrx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值