Ошибка в использовании созданного пользовательского виджета в конструкторе - PullRequest
1 голос
/ 11 апреля 2011

У меня проблема с использованием созданного пользовательского виджета.Я успешно создал пользовательский виджет, который производит файл .dll.Я поместил этот DLL-файл в bin / designer.Это было также признано в дизайнере.Я использовал его и поместил на свой интерфейс.Но когда я попытался его построить, произошла ошибка.

debug \ moc_cribblearea.cpp (44): предупреждение C4273: «staticMetaObject»: несогласованная связь dll d: \ project \ qt \ workspace \ sample-build-desktop \ debug ../../oep / scribblearea.h (53): см. предыдущее определение «public: static QMetaObject const ScribbleArea :: staticMetaObject»

debug \ moc_cribblearea.cpp (44): ошибка C2491: «ScribbleArea :: staticMetaObject»: определениеэлемента статических данных dllimport не разрешено

debug \ moc_cribblearea.cpp (54): предупреждение C4273: 'ScribbleArea :: metaObject': несогласованная связь dll d: \ project \ qt \ workspace \ sample-build-desktop \ \debug ../../ sample / scribblearea.h (53): см. предыдущее определение 'metaObject'

debug \ moc_cribblearea.cpp (59): предупреждение C4273: 'ScribbleArea :: qt_metacast': противоречивая dllсвязь d: \ project \ qt \ workspace \ sample-build-desktop \ debug ../../ sample / scribblearea.h (53): см. предыдущее определение 'qt_metacast'

debug \ moc_scribeblearea.cpp(67): предупреждение C4273: 'ScribbleArea :: qt_metacall': противоречивая связь dll d: \ project \ qt \ workspace \ sample-build-desktop \ debug ../../ oep / scribblearea.h (53): см. предыдущее определение' qt_metacall '

Как правильно использовать созданный мной виджет?Существуют ли какие-либо документы / ссылки, в которых описано, как использовать пользовательский виджет, от копирования .dll в папку bin / designer до создания проекта?

1 Ответ

0 голосов
/ 12 апреля 2011

Я никогда не создавал пользовательский виджет, хранящийся в .dll, поэтому я не могу помочь вам ответить на ваш основной вопрос, но у меня есть обходной путь:

Если ваш пользовательский виджет относительно прост (он не имеет сложных свойств, которые явно требуют редактора форм), вы можете создать заполнитель другого типа (например, суперкласс вашего виджета) в вашей контейнерной форме, чтобы иметь возможность устанавливать основные свойства, такие как положение, геометрия, размер& size-policy, а затем замените этот заполнитель на ваш собственный виджет, используя некоторый простой код в конструкторе формы контейнера.

Допустим, у вас есть следующее:

a.Пользовательский виджет GuiInpImageView, унаследованный от QGraphicsView: GuiInpImageView :: GuiInpImageView (QWidget * parent): QGraphicsView (parent)

b.Mainwindowbase.ui (класс MainWindow), в который вы на самом деле хотите поместить экземпляр GuiInpImageView

Это пошаговое решение:

  1. Поместите.cpp исходный файл и заголовочный файл для GuiInpImageView непосредственно в вашем проекте (не в DLL)

  2. Определите следующий закрытый член в заголовке класса MainWindow: GuiInpImageView * inpImageView;

  3. Откройте mainwindowvase.ui в редакторе форм и поместите виджет QGraphicsView в положение, в котором вы на самом деле хотели разместить свой пользовательский виджет GuiInpImageView.Допустим, вы создали вертикальный макет с именем inpImageViewVertLayout, содержащий QGraphicsView с именем inpImageViewPH (PH = PlaceHolder).Вы также можете установить - если хотите - геометрию, минимальный и максимальный размер и политику размера inpImageViewPH, используя свойства, представленные в редакторе форм QtCreator.

  4. Вставьте следующий код вВаш конструктор MainWindow:

// Main Window Constructor<br> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)<br> {</p> <pre><code>setupUi(this); // Setup UI // Replace inpImageViewPH with custom Widget // (inpImageViewPH is just a place holder to visualize UI in design mode) inpImageView = new GuiInpImageView(centralwidget); inpImageView->setGeometry(inpImageViewPH->geometry()); inpImageView->setMinimumSize(inpImageViewPH->minimumSize()); inpImageView->setMaximumSize(inpImageViewPH->maximumSize()); inpImageView->setSizePolicy(inpImageViewPH->sizePolicy()); inpImageViewVertLayout->addWidget(inpImageView); // Remove and hide placeholder, keep only the Custom View inpImageViewVertLayout->removeWidget(inpImageViewPH); inpImageViewPH->hide(); ...

Это самый простой способ, который я нашел, чтобы вставить пользовательский виджет в формуиспользовать код (без создания .DLL), но также иметь графический просмотр и некоторый контроль над положением и размером виджета в контейнере формы.

Надеюсь, это поможет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...