在设计器中使用创建的自定义小部件出错

时间:2011-04-11 12:55:01

标签: qt dll widget

我在使用创建的自定义小部件时遇到问题。我已经成功创建了一个生成.dll文件的自定义小部件。我把这个.dll文件放在bin / designer下面。它也得到了设计师的认可。我用它并把它放在我的ui上。但是当我尝试构建它时,发生了错误。

  

debug \ moc_scribblearea.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_scribblearea.cpp(44):错误C2491:'ScribbleArea :: staticMetaObject':不允许定义dllimport静态数据成员

     

debug \ moc_scribblearea.cpp(54):警告C4273:'ScribbleArea :: metaObject':不一致的dll链接   d:\ project \ qt \ workspace \ sample-build-desktop \ debug ../../ sample / scribblearea.h(53):参见'metaObject'的先前定义

     

debug \ moc_scribblearea.cpp(59):警告C4273:'ScribbleArea :: qt_metacast':不一致的dll链接   d:\ project \ qt \ workspace \ sample-build-desktop \ debug ../../ sample / scribblearea.h(53):参见'qt_metacast'的先前定义

     

debug \ moc_scribblearea.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 :(得分:0)

我从未创建存储在.dll中的自定义窗口小部件,因此我无法帮助解决您的主要问题,但我有一个解决方法:

如果您的自定义窗口小部件相对简单(它没有明确需要表单编辑器的复杂属性),您可以在容器形式中创建另一种占位符(例如,窗口小部件的超类),以便能够设置基本属性,如位置,几何,大小和size-policy然后使用容器表单构造函数中的一些简单代码将此占位符替换为您的自定义窗口小部件。

假设您有以下内容:

一个。从QGraphicsView继承的自定义小部件GuiInpImageView: GuiInpImageView :: GuiInpImageView(QWidget * parent):QGraphicsView(父级)

湾一个mainwindowbase.ui(类MainWindow),你实际上想要放置一个GuiInpImageView实例

这是逐步解决方法:

  1. 放入.cpp源码& GuiInpImageView的头文件直接在您的项目中(不在DLL中)

  2. 在MainWindow类标题中定义以下私有成员: GuiInpImageView * inpImageView;

  3. 在Form-Editor中打开mainwindowvase.ui并将QGraphicsView小部件放在您想要放置自定义GuiInpImageView小部件的位置。 假设您创建了一个名为inpImageViewVertLayout的垂直布局,其中包含名为inpImageViewPH(PH = PlaceHolder)的QGraphicsView。 您也可以设置 - 如果您愿意 - 几何,Min&使用QtCreator的表单编辑器中公开的属性的inpImageViewPH的最大大小和大小策略。

  4. 将以下代码放入MainWindow构造函数中:

  5. // Main Window Constructor
    MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
    {

    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();
    
    ...
    

    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)在表单中插入自定义窗口小部件的最简单方法,但也有一个图形预览和一些关于位置和控制的控件。表单容器中窗口小部件的大小。

    希望这会有所帮助......