2011-04-11 109 views
1

我在使用創建的自定義小部件時遇到問題。我已經成功創建了一個生成.dll文件的自定義小部件。我將這個.dll文件放在bin/designer下。它在設計師中也得到了認可。我用它把它放在我的用戶界面上。但是當我嘗試構建它時,發生錯誤。在設計器中使用創建的自定義小部件時出錯

調試\ moc_scribblearea.cpp(44):警告C4273: 'staticMetaObject':不一致的dll聯動 d:\項目\ QT \工作空間\採樣集結桌面\調試../../ OEP/scribblearea.h(53):參見以前的定義'public:static QMetaObject const ScribbleArea :: staticMetaObject'

debug \ moc_scribblearea.cpp(44):error C2491:'ScribbleArea :: staticMetaObject':定義dllimport靜態數據成員不允許

debug \ moc_scribblearea.cpp(54):warning C4273:'ScribbleArea :: metaObject':不一致的dll鏈接 d:\ pro ject \ qt \ workspace \ sample-build-desktop \ debug ../../ sample/scribblearea.h(53):參見'metaObject'的先前定義

debug \ moc_scribblearea.cpp(59):warning C4273 :'ScribbleArea :: qt_metacast':dll聯動不一致 d:\ project \ qt \ workspace \ sample-build-desktop \ debug ../../ sample/scribblearea.h(53):參見'qt_metacast'

debug \ moc_scribblearea.cpp(67):warning C4273:'ScribbleArea :: qt_metacall':dll聯動不一致 d:\ project \ qt \ workspace \ sample-build-desktop \ debug ../../ oep /scribblearea.h(53):參見之前定義的'qt_metacall'

如何正確使用我創建的自定義小部件?是否有描述如何使用自定義小部件的文檔/參考,從複製.dll到bin/designer文件夾直至構建項目?

回答

0

我從來沒有創造存儲在一個.dll自定義窗口小部件,所以我不能幫你在你的首要問題,但我有一個變通方法來提供:

如果自定義窗口小部件是相對簡單的(它沒有明確需要表單編輯器的複雜屬性),你可以在你的容器表單中創建另一種類型的佔位符(例如你的小部件的超類),以便能夠設置像位置,幾何形狀,大小等基本屬性& size-policy,然後用容器表單構造函數中的一些簡單代碼替換此自定義小部件的佔位符。

假設您有以下幾種:

a。從QGraphicsView繼承的定製窗口小部件GuiInpImageView: GuiInpImageView :: GuiInpImageView(QWidget * parent):QGraphicsView(parent)

b。一個mainwindowbase.ui(類主窗口),在此你真的想放GuiInpImageView

的實例,這是解決辦法的解決方案一步一步:

  1. 把。直接在你的項目中GuiInpImageView CPP源&頭文件(不是在一個DLL)

  2. 定義在主窗口類的頭下面的私有成員: GuiInpImageView * inpImageView;

  3. 在Form-Editor中打開mainwindowvase.ui,並將QGraphicsView小部件放置在實際想要放置自定義GuiInpImageView小部件的位置。 比方說,您已經創建了一個名爲inpImageViewVertLayout的垂直佈局,其中包含一個名爲inpImageViewPH(PH = PlaceHolder)的QGraphicsView。 您也可以使用QtCreator的表單編輯器中公開的屬性設置 - 如果您希望 - 幾何體,Min &最大尺寸和inpImageViewPH的尺寸策略。

  4. 將下面的代碼到你的主窗口的構造函數:

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

... 

這是我發現插入使用代碼的形式自定義插件的最簡單的方法(不創建一個.DLL ),而且還需要圖形預覽和一些關於窗體容器中窗口小部件位置的控件。

希望這有助於...

+0

感謝您的回覆。我會嘗試這一個。 – user702159 2011-04-13 12:18:17

相關問題