2011-12-02 11 views
8

Sto creando un editor di testo e vorrei inserire lo QComboBox nello QMenu. Non ho trovato alcun metodo all'interno del QMenu che ha gestito una cosa del genere. Il più vicino è QMenu::addAction(). Mi stavo chiedendo di aggirare questo ostacolo.C'è un modo per aggiungere QWidget a QMenu in QtCreator

Grazie!

risposta

16

Devi sottoclasse QWidgetAction e quindi chiamare semplicemente il addAction nel menu.

codice di esempio per azione Spin scatola con un'etichetta

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; 
}; 

Ora semplicemente crearlo e aggiungerlo al menu

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

Perché preferiresti la sottoclasse di QWidgetAction? Non offrirebbe un accoppiamento più flessibile e un codice più gestibile per istanziare una QWidgetAction separatamente dal tuo 'pWidget' e chiamare' setDefaultWidget'? L'unica ragione per sottoclasse non sarebbe l'implementazione di 'createWidget'? –

+0

Dipende. Se si desidera disporre di azioni riutilizzabili del widget ed evitare di riscrivere le stesse parti di codice per crearle, è necessario creare una sottoclasse. Per esempio, una volta avevo bisogno di un QMenu con più caselle di selezione con un'etichetta e valori e prefissi min/max variabili. Con la sottoclasse di 'QWidgetAction' ero in grado di avere un elemento riutilizzabile, e in ogni caso dovevo solo cambiare gli argomenti del costruttore. Inoltre è semplice creare una piccola libreria con i widget di azione e basta chiamare quello di cui hai bisogno quando ne hai bisogno. – pnezis

+0

Non ho familiarità con questo tipo di costruttore: 'SpinBoxAction (const QString & title): QWidgetAction (NULL) {}' –

1

si può sempre usare un QWidget o QFrame come il menu Widget, poi mettere un QHBoxLayout su di esso, e inserire il QWidgets all'interno.

+0

Questa idea mi è effettivamente venuta in mente. Sono un po 'nuovo per Qt quindi perdonami se è un po' elementare: come impostare il mio QWidget come Widget del Menu. –

1

QWidgetAction è un QAction che contiene un QWidget. Puoi usare questo per incapsulare il tuo QComboBox e aggiungerlo al tuo menu tramite QMenu::addAction.

Problemi correlati