2011-12-02 65 views

回答

16

你必須繼承QWidgetAction,然後只需調用addAction到您的菜單。對於旋轉框行動

示例代碼與標籤

class SpinBoxAction : public QWidgetAction { 
public: 
    SpinBoxAction (const QString& title) : 
     QWidgetAction (NULL) { 
     QWidget* pWidget = new QWidget (NULL); 
     QHBoxLayout* pLayout = new QHBoxLayout(); 
     QLabel pLabel = new QLabel (title); 
     pLayout->addWidget (pLabel); 
     pSpinBox = new QSpinBox(NULL); 
     pLayout->addWidget (pSpinBox); 
     pWidget->setLayout (pLayout); 

     setDefaultWidget(pWidget); 
    } 

    QSpinBox * spinBox() { 
     return pSpinBox; 
    } 

private: 
    QSpinBox * pSpinBox; 
}; 

現在,只需創建它,並把它添加到您的菜單

SpinBoxAction * spinBoxAction = new SpinBoxAction(tr("Action Title")); 
// make a connection 
connect(spinBoxAction ->spinBox(), SIGNAL(valueChanged(int)), 
     this, SLOT(spinboxValueChanged(int))); 
// add it to your menu 
menu->addAction(spinBoxAction); 
+0

你爲什麼喜歡繼承QWidgetAction?它不會提供更鬆散的耦合和更多可維護的代碼來實例化一個QWidgetAction與你的'pWidget'分開並調用'setDefaultWidget'嗎?子類的唯一理由不是實現'createWidget'嗎? –

+0

這取決於。如果你想有可重用的小部件操作,並避免重寫相同的代碼部分來創建它們,你應該繼承它們。例如,我曾經需要一個帶有標籤的多個旋鈕框的QMenu,以及不同的最小/最大值和前綴。通過繼承'QWidgetAction',我能夠擁有一個可重用的元素,並且在任何情況下我只需要更改構造函數參數。創建一個帶有動作小部件的小型圖書館也很簡單,只需在需要時撥打所需的圖書館即可。 – pnezis

+0

我不familar用這種構造的:'SpinBoxAction(常量QString的職銜): QWidgetAction(NULL){}' –

1

您可以隨時使用QWidgetQFrame作爲Menu Widget,然後在其上放置一個QHBoxLayout,並在其中插入您的QWidgets

+0

這個想法實際上發生在我身上。我對Qt有點新奇,所以請原諒我,如果這是基本的話:我如何設置我自己的QWidget作爲Menu Widget。 –

1

QWidgetActionQAction包含QWidget。您可以使用它來封裝您的QComboBox並通過QMenu::addAction將其添加到您的菜單。

相關問題