将小部件添加到 Qt Designer

Vic*_*tor 5 c++ qt widget qt-designer

我最近发现 Qt 支持自定义小部件,并且有提供此类小部件的网站(例如Qt-Apps)。如果相关,我有兴趣得到这个小部件。

我已经下载了它的源代码,我已经提取了它等等。我还没有尝试构建它,但我感兴趣的是将该小部件放在 Qt Designer 左侧的小部件列表中,以便我可以在我的应用程序中使用它。

我要么不知道如何搜索我要找的东西,要么它根本不存在。请帮我解决这个问题。

Tay*_*510 4

有两种方法:

A. 使用促销

最简单的方法。该方法直接获取源码,无需构建。

B.为 Designer 构建插件库

这有点乏味...


简而言之,假设您有一个所需的类(小部件):CustomWidget带有customwidget.cppcustomwidget.h

  1. 创建一个新的工厂类,也许可以调用它CustomWidgetPlugin并公共继承QObjectQDesignerCustomWidgetInterface重新实现一些虚拟函数。

例子:

customwidget.h :

    #include <QDesignerCustomWidgetInterface>
    #include "customwidget.h"

    class CustomWidgetPlugin : public QObject, public QDesignerCustomWidgetInterface
    {
        Q_OBJECT
        Q_INTERFACES(QDesignerCustomWidgetInterface) // note this line, it tell moc that the second base class is a plugin interface.

    public:
        CustomWidget(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);
    };
Run Code Online (Sandbox Code Playgroud)

customwidget.cpp :

构造函数:

CustomWidget::CustomWidgetPlugin(QObject *parent)
: QObject(parent)
{
}
Run Code Online (Sandbox Code Playgroud)

名称获取器:

QString CustomWidgetPlugin::name() const
{
    return "CustomWidget";
}
Run Code Online (Sandbox Code Playgroud)

头文件获取器:

QString CustomWidgetPlugin::includeFile() const
{
    return "customwidget.h";
}
Run Code Online (Sandbox Code Playgroud)

组名获取器:

QString CustomWidgetPlugin::group() const
{
    return tr("New Group");
}
Run Code Online (Sandbox Code Playgroud)

(组名称定义小部件所属的位置,如果该名称不适合任何默认组,则会创建一个新组)

在此输入图像描述

图标(用于设计器中显示的图标):

QIcon CustomWidgetPlugin::icon() const
{
    return QIcon(":/images/icon.png");
}
Run Code Online (Sandbox Code Playgroud)

小部件的工具提示:

QString  CustomWidgetPlugin::toolTip() const
{
    return tr("This is a widget, got it?");
}
Run Code Online (Sandbox Code Playgroud)

这是什么的信息:

QString CustomWidgetPlugin::whatsThis() const
{
    return tr("A widget, already said.");
}
Run Code Online (Sandbox Code Playgroud)

定义它是否是一个“容器”(是否可以容纳另一个小部件):

bool CustomWidgetPlugin::isContainer() const
{
    return false;
}
Run Code Online (Sandbox Code Playgroud)

工厂会员功能:

QWidget *CustomWidgetPlugin::createWidget(QWidget *parent)
{
    return new CustomWidget(parent);
}
Run Code Online (Sandbox Code Playgroud)

重要的!!

在文件末尾customwidget.cpp添加以下宏:

Q_EXPORT_PLUGIN2(customwidgetplugin , CustomWidgetPlugin) // (the widget name, the class name)
Run Code Online (Sandbox Code Playgroud)

它使 Qt 设计器可以使用该插件。

最后,在你的.pro文件中:

TEMPLATE = lib
CONFIG += designer plugin release
HEADERS = ../customwidget.h \
customwidgetplugin.h
SOURCES = ../customwidget.cpp \
customwidgetplugin.cpp
RESOURCES = customwidget.qrc
DESTDIR = $(QTDIR)/plugins/designer #assume QTDIR environment variable is set to the directory where Qt is installed.
Run Code Online (Sandbox Code Playgroud)

构建此项目后,下次打开 Qt 设计器时,您将看到该小部件。

参考:使用 Qt 4 进行 C++ GUI 编程