Search code examples
c++qtqwidgetqmenu

Is there a way to add a QWidget to a QMenu in QtCreator


I'm creating a text editor and I'd like to put the QComboBox in the QMenu. I didn't find any method inside the QMenu that handled such a thing. The closest is QMenu::addAction(). I was wondering of getting around this hurdle.

Thanks!


Solution

  • You have to subclass QWidgetAction and then simply call the addAction to your menu.

    Example code for Spin Box Action with a label

    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);  //bug fixed here, pointer was missing
            pLayout->addWidget (pLabel);
            pSpinBox = new QSpinBox(NULL);
            pLayout->addWidget (pSpinBox);
            pWidget->setLayout (pLayout);
    
            setDefaultWidget(pWidget);
        }
    
        QSpinBox * spinBox () {
            return pSpinBox;
        }
    
    private:
        QSpinBox * pSpinBox;
    };
    

    Now simply create it and add it to your 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);