簡體   English   中英

如何在QT Creator中推廣自定義小部件

[英]How to promote a custom widget in QT Creator

在qt 5.2.1中,我創建了一些自定義小部件,比如按鈕。 傳統上有兩種方法可以做到這一點。 您可以升級現有小部件。 並更改/添加功能。 或者從頭開始創建自定義小部件。 我用過后者。

但是,在某些情況下,我想使用我的自定義小部件,但通過推廣更改其中的一些功能。 通常的方法是添加一個小部件,然后進行推廣。 但是,在創建新類型的提升窗口小部件時,必須選擇基類。 在可以執行此操作的對話框中,僅列出默認小部件。

是否可以將自定義小部件添加到此列表中?

問候,

Lauris

編輯:

我玩過很多次。 現在突然間,一個自定義小部件被添加到基類列表中。 但我仍然不知道我是如何添加它的。 為什么這是列表中唯一顯示的自定義小部件。

假設我們需要創建自定義按鈕類,例如MyButton 它繼承了QPushButton ,重新實現了它的一些方法並添加了新的方法。 現在我們需要將它添加到Qt Designer表單中。 我們在表單中添加了一個按鈕,並將其提升為MyButton類。 這個動作意味着什么?

  • Qt Designer生成的Ui類將具有MyButton*類型的成員。 您可以使用ui->myButton (如果您這樣命名)來訪問該對象並使用其所有方法。 當然,所有QPushButton的方法也都可用,因為這就是C ++繼承的含義。
  • Qt Designer將知道MyButton繼承QPushButton並允許您編輯其特定屬性(例如checkable )並訪問其插槽(例如, clicked )。

現在我們想針對某些特殊情況擴展MyButton功能。 我們創建了一個名為MySpecialButton的類,該類派生自MyButton並略微改變其行為。 我們如何將其添加到表單中? 就像上面那個。 我們在表單中添加一個按鈕,並將其提升為MySpecialButton類。 Qt Designer並不關心QPushButtonMySpecialButton的直接基礎還是有很長的繼承鏈。 它仍然允許編輯特定於按鈕的屬性,並且您仍然可以通過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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM