Tienes que crear la subclase QWidgetAction
y luego simplemente llamar al addAction
a tu menú.
Código de ejemplo para la Acción cuadro de número con una etiqueta
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;
};
Ahora basta con crear y agregarlo a su menú
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);
¿Por qué preferiría subclasificar QWidgetAction? ¿No ofrecería un acoplamiento más flexible y un código más fácil de mantener para instanciar un QWidgetAction por separado de su 'pWidget' y llamar a' setDefaultWidget'? ¿No sería la única razón para subclasificar implementar 'createWidget'? –
Depende. Si desea tener acciones de widget reutilizables y evitar volver a escribir las mismas partes de código para crearlas, debe crear una subclase. Por ejemplo, una vez necesité un QMenu con múltiples cajas giratorias con una etiqueta, y variando los valores mínimo/máximo y el prefijo. Al subclasificar el 'QWidgetAction' pude tener un elemento reutilizable, y en cada caso solo tuve que cambiar los argumentos del constructor. También es sencillo crear una pequeña biblioteca con widgets de acción y simplemente llamar a la que necesita cuando la necesita. – pnezis
No estoy familiarizado con este tipo de constructor: 'SpinBoxAction (const QString y título): QWidgetAction (NULL) {}' –