QT UIC не добавляет автоматически заголовки для пользовательских виджетов.

я сделал пользовательский виджет «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», потому что он не знает, что это такое.


person Amazonasmann    schedule 14.05.2013    source источник
comment
Я решил эту проблему, добавив что-то в свой cmake. Я пропустил каталог include, поэтому, если кто-то использует CMAKE и имеет ту же проблему, добавьте это в свой cmake:   -  person Amazonasmann    schedule 14.05.2013


Ответы (1)


У меня возникла эта проблема при включении пользовательских классов в файл QtDesigner .ui. uic хорошо добавляет соответствующие заголовки, когда вы используете опцию "Повысить до...".

  1. Щелкните правой кнопкой мыши любой виджет в макете.
  2. Выберите «Повысить до…».
  3. Выберите базовый класс и введите имя повышенного класса «NewClass». Он автоматически добавляет #include "NewClass.h" в файл "ui_yourclass.h".

К сожалению, это создает избыточные предупреждения о включении, когда другой файл конструктора обращается к тому же пользовательскому классу и оба файла «ui_yourclass.h» включаются из одного заголовка. Кроме того, необходимость продвижения виджета делает обязательным создание и инициализацию одного экземпляра этого класса в файле макета дизайнера.

Другой способ, о котором я читал, - это перейти в «Инструменты»> «Редактор форм»> «Настройки формы» и добавить «NewClass.h» в разделы, озаглавленные «Включить подсказки». Но я никогда не делал это таким образом.

person buster    schedule 14.05.2013