5.3 在Qt设计师中集成自定义窗口部件
在Qt设计师中使用自定义窗口部件之前,我们必须让Qt设计师先察觉到它们的存在。有两种方法可以完成这一任务:改进法(promotion)和插件法(pluigin)。改进法是最为快捷和简单的方法。这种方法包括:选择一个内置的Qt窗口部件,但该窗口部件要和我们自定义的窗口部件具有相类似的应用程序编程接口,并在Qt设计师的自定义窗口部件对话框(如图5.6所示)中填写一些与这个窗口部件相关的信息。然后,这个自定义窗口部件就可用于由Qt设计师开发的窗体中,尽管在编辑或者预览该窗体时它有可能仍旧显示为与之相关的内置Qt窗口部件的形式。
5.3.1 改进法
以下给出了如何使用这种方法在窗体中插人一个HexSpinBox窗口部件的步骤:
1.从Qt设计师的左侧窗口部件工具盒中拖动一个QSpinBox到窗体中,由此创建一个QSpinBox。
2.右键单击这个微调框,并且从上下文菜单中选择“提升为…"(改进成自定义窗口部件)。
3.在弹出的对话框中,填入“HexSpinBox"作为类的名字,填入“hexspinbox.h"作为头文件的名字。
这三步就足够了。由uic生成的代码将会包含hexspinbox.h,而不是,并且会生成一个HexSpinBox 的实例。在Qt设计师中,将会用QSpinBox的图标来代表HexSpinBox 窗口部件,从而允许我们设置QSpinBox的所有属性(例如,它的作用范围和当前值)。
改进法的缺点是:在Qt设计师中,无法对自定义窗口部件中的那些特定属性进行访问,并且也无法对这个窗口部件自身进行绘制。所有这两个问题都可以通过使用插件法得到解决。
5.3.2 插件法
插件法需要创建一个插件库,Qt设计师可以在运行时加载这个库,并且可以利用该库创建窗口部件的实例。在对窗体进行编辑或者用于窗体预览时,Qt设计师就会用到这个真正的窗口部件,这要归功于Qt的元对象系统,Qt设计师才可以动态获取它的这些属性的列表。为了说明它是如何工作的,我们将把前一小节中的IconEditor 集成为一个插件。
首先,必须对QDesignerCustomWideTnterface进行子类化,并且需要重新实现一些虚函数。假定插件的源代码放在一个名 为iconeditorplugin的目录中,并且IconEditor 的源代码放在与iconeditorplugin目录同级的iconeditor 目录中。
//iconeditorplugin.h
#ifndef ICONEDITORPLUGIN_H
#define ICONEDITORPLUGIN_H
#include <QDesignerCustomWidgetInterface>
class IconEditorPlugin : public QObject,
public QDesignerCustomWidgetInterface
{
/* IconEditorPlugin子类是一个封装了这个IconEditor窗口部件的工厂(factory)类。
* 它从QObject和QDesignerCustomWidegtlterface中派生而来,并且使用Q_INTERFACES()宏通知moc:这里的第二个基类是一个插件接口。
* Qt设计师会使用这些函数创建这个类的各个实例并且获取相关信息。
*/
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetInterface)
public:
IconEditorPlugin(QObject *parent = 0);
QString name() const;
QString includeFile() const;
QString group() const;
QIcon icon() const;
QString toolTip(