2011-12-02 9 views

Respuesta

16

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); 
+0

¿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'? –

+0

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

+0

No estoy familiarizado con este tipo de constructor: 'SpinBoxAction (const QString y título): QWidgetAction (NULL) {}' –

1

siempre se puede utilizar un QWidget o QFrame como el menú de widgets, a continuación, poner una QHBoxLayout en él, e inserte su QWidgets interior.

+0

Esta idea en realidad se me ocurrió. Soy un poco nuevo para Qt, así que discúlpame si esto es algo básico: ¿Cómo puedo configurar mi propio QWidget como el widget de menú? –

1

QWidgetAction es una QAction que contiene una QWidget. Puede usar esto para encapsular su QComboBox y agregarlo a su menú a través del QMenu::addAction.

Cuestiones relacionadas