[英]How to promote a custom widget in QT Creator
在qt 5.2.1中,我創建了一些自定義小部件,比如按鈕。 傳統上有兩種方法可以做到這一點。 您可以升級現有小部件。 並更改/添加功能。 或者從頭開始創建自定義小部件。 我用過后者。
但是,在某些情況下,我想使用我的自定義小部件,但通過推廣更改其中的一些功能。 通常的方法是添加一個小部件,然后進行推廣。 但是,在創建新類型的提升窗口小部件時,必須選擇基類。 在可以執行此操作的對話框中,僅列出默認小部件。
是否可以將自定義小部件添加到此列表中?
問候,
Lauris
編輯:
我玩過很多次。 現在突然間,一個自定義小部件被添加到基類列表中。 但我仍然不知道我是如何添加它的。 為什么這是列表中唯一顯示的自定義小部件。
假設我們需要創建自定義按鈕類,例如MyButton
。 它繼承了QPushButton
,重新實現了它的一些方法並添加了新的方法。 現在我們需要將它添加到Qt Designer表單中。 我們在表單中添加了一個按鈕,並將其提升為MyButton
類。 這個動作意味着什么?
MyButton*
類型的成員。 您可以使用ui->myButton
(如果您這樣命名)來訪問該對象並使用其所有方法。 當然,所有QPushButton
的方法也都可用,因為這就是C ++繼承的含義。 MyButton
繼承QPushButton
並允許您編輯其特定屬性(例如checkable
)並訪問其插槽(例如, clicked
)。 現在我們想針對某些特殊情況擴展MyButton
功能。 我們創建了一個名為MySpecialButton
的類,該類派生自MyButton
並略微改變其行為。 我們如何將其添加到表單中? 就像上面那個。 我們在表單中添加一個按鈕,並將其提升為MySpecialButton
類。 Qt Designer並不關心QPushButton
是MySpecialButton
的直接基礎還是有很長的繼承鏈。 它仍然允許編輯特定於按鈕的屬性,並且您仍然可以通過ui
變量完全訪問MySpecialButton
方法。
QPushButton
只是一個例子。 即使您在表單中將QWidget
提升為MySpecialButton
,上述所有內容都將成立。 它唯一的區別是Qt Designer不允許編輯QPushButton
屬性並訪問它的插槽,限制你使用QWidget
的屬性。 另一方面,您不需要從QPushButton
派生MyButton
。 您可以選擇QWidget
或其任何子類作為基礎。 選擇具有最接近功能的類是合理的,因此您需要實現更少的功能。 在推廣之前選擇最直接的基類是合理的,因為您將能夠訪問更多屬性。 這只是方便的問題。 (但是當然如果你為促銷選擇了錯誤的基類,它將無法工作。)
這似乎是Qt Creator中的一個錯誤。 一種解決方法,奇怪的是將小部件兩次添加到小部件庫導出的小部件列表中:
IOSwidgets::IOSwidgets(QObject *parent)
: QObject(parent)
{
m_widgets.append(new aircraftAttitudePlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new alfabeticKeypadPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new arrowedFramePlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new buttonWidgetPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new dataButtonPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new frameWidgetPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new headingDialPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new imageWidgetPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new labelWidgetPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new linkedButtonWidgetPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new linkedLabelWidgetPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new linkedSliderWidgetPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new NavButtonPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new numericKeypadPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new repositionWidgetPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new runwayInformationPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new slewWidgetPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new sliderWidgetPlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new WeightBalancePlugin(this));
m_widgets.append(m_widgets.last());
m_widgets.append(new WindshearMicroburstLateralPlugin(this));
m_widgets.append(m_widgets.last());
}
希望這可以節省下一個遇到這個問題的人,我付出了艱苦的努力和花費了大量的時間來找到這個問題:)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.