QT UIC不会自动附加自定义窗口小部件的标头

时间:2013-05-14 11:13:01

标签: c++ qt plugins qt-designer

我制作了一个自定义小部件“DuwagWidget”和自定义小部件插件“DuwagWidgetPlugin”,可以将其拖放到qt设计器中以创建我的duwag.ui文件。

然而,当我尝试编译我的程序时,ui_duwag.h是从QT用户界面编译器生成的,但在这个自动生成的文件中,uic不包含我的“DuwagWidget.h”,这是创建自定义小部件类。

DuwagWidgetPlugin(从QT中的接口派生以创建CustomWidgets)只是DuwagWidget的工厂类。

以下是DuwagWidgetPlugin的代码:^

    #include <DuwagWidgetPlugin.h>
    #include <QtPlugin>
    #include <qwidget.h>
    #include <MTBFWidget.h>


    DuwagWidgetPlugin::DuwagWidgetPlugin( QObject *parent ) : QObject(parent) {
        initialized = false;
    }

    void DuwagWidgetPlugin::initialize(QDesignerFormEditorInterface * /* core */) {

        if (initialized)
            return;
        initialized = true;
     }

    bool DuwagWidgetPlugin::isInitialized() const {
        return initialized;
    }

    QWidget *DuwagWidgetPlugin::createWidget(QWidget *parent) {
        return new DuwagWidget( parent );
    }

    QString DuwagWidgetPlugin::name() const {
        return "DuwagWidget";
    }

    QString DuwagWidgetPlugin::group() const {
        return "duwagplugin";
    }

    QIcon DuwagWidgetPlugin::icon() const {
        return QIcon();
    }

    QString DuwagWidgetPlugin::toolTip() const {
        return "The duwag control panel";
    }

    QString DuwagWidgetPlugin::whatsThis() const {
        return "The duwag Control panel";
    }

    bool DuwagWidgetPlugin::isContainer() const {
        return false;
    }

    QString DuwagWidgetPlugin::domXml() const {
        return  "<widget class=\"DuwagWidget\" name=\"DuwagWidget\">\n"
                    " <property name=\"geometry\">\n"
                "  <rect>\n"
                "   <x>0</x>\n"
                "   <y>0</y>\n"
                "   <width>100</width>\n"
                "   <height>100</height>\n"
                "  </rect>\n"
                " </property>\n"
                " <property name=\"toolTip\" >\n"
                "  <string>The MTBF Control panel</string>\n"
                " </property>\n"
                " <property name=\"whatsThis\" >\n"
                "  <string>The MTBF Control panel.</string>\n"
                " </property>\n"
                "</widget>\n";
    }

    QString DuwagWidgetPlugin::includeFile() const {
        return "DuwagWidget.h";
    }

    Q_EXPORT_PLUGIN2(duwagplugin, DuwagWidgetPlugin)

所以问题是,在生成的头文件中,它无法创建自定义小部件“DuwagWidget”,因为它不知道它是什么..

1 个答案:

答案 0 :(得分:0)

在QtDesigner .ui文件中包含自定义类时遇到此问题。当您使用“提升为...”选项时,uic执行正常添加相应标题的工作。

  1. 右键点击布局中的任何小部件。
  2. 选择“推广到......”。
  3. 选择基类并键入提升类“NewClass”的名称。它会自动将#include "NewClass.h"添加到文件“ui_yourclass.h”。
  4. 不幸的是,当另一个设计器文件访问同一个自定义类并且同一个头中包含“ui_yourclass.h”文件时,这会产生冗余包含警告。此外,需要升级窗口小部件使您必须在设计器布局文件中创建和初始化该类的一个实例。

    我读到的另一种方法是转到工具&gt;表单编辑器&gt;表单设置并在标题为“包含提示”的部分中添加“NewClass.h”。但我从来没有这样做过。