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);
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'? –
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
Non ho familiarità con questo tipo di costruttore: 'SpinBoxAction (const QString & title): QWidgetAction (NULL) {}' –