c++qtpopupqpushbuttonqmenu

Set position (to right) of Qt QPushButton popup menu


I am writing a popup menu for a Qt push button widget. Whenever the push button is clicked, a menu pops up (below the push button).

The popup menu is left-sided below by default.

Are there any ways to make the popup menu to pop up on the right side below the push button?

There is no set position function, so I wonder if there is some sophisticated way of doing it?

Here is some code (for popup menu):

QMenu *menuMode = new QMenu(this);
    min = menu ->addAction("In");
    mout = menu ->addAction("out");
ui->pushButtonMode->setMenu(menuMode);   //I am writing in MainWindow, that's there is ui

Solution

  • This can be done by subclassing QMenu and moving the popup menu where you want to have it in showEvent:

    popupmenu.h

    #ifndef POPUPMENU_H
    #define POPUPMENU_H
    
    #include <QMenu>
    
    class QPushButton;
    class QWidget;
    
    class PopupMenu : public QMenu
    {
        Q_OBJECT
    public:
        explicit PopupMenu(QPushButton* button, QWidget* parent = 0);
        void showEvent(QShowEvent* event);
    private:
        QPushButton* b;
    };
    
    #endif // POPUPMENU_H
    

    popupmenu.cpp

    #include "popupmenu.h"
    #include <QPushButton>
    
    PopupMenu::PopupMenu(QPushButton* button, QWidget* parent) : QMenu(parent), b(button)
    {
    }
    
    void PopupMenu::showEvent(QShowEvent* event)
    {
        QPoint p = this->pos();
        QRect geo = b->geometry();
        this->move(p.x()+geo.width()-this->geometry().width(), p.y());
    }
    

    mainwindow.cpp

    ...
    PopupMenu* menu = new PopupMenu(ui->pushButton, this);
    ...
    ui->pushButton->setMenu(menu);
    

    It looks like this:

    enter image description here