Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

QToolButton: change menu position

Tags:

qt

When using menu with QToolButton menu is shown right under the button. Is there a way to display menu in the left/right of the button?

like image 414
maverik Avatar asked Dec 07 '11 12:12

maverik


2 Answers

I know this question was answered a while ago, but I wanted to add a new answer to this question since the accepted answer is no longer valid. It is actually quite easy to change the menu position on a QToolButton. You need to subclass QMenu and override the event function. When there is a show event, just change the position of the menu.

Here is a simple example using PySide:

from PySide import QtCore, QtGui

class MyMenu(QtGui.QMenu):
    def event(self,event):
        if event.type() == QtCore.QEvent.Show:
            self.move(self.parent().mapToGlobal(QtCore.QPoint(0,0))-QtCore.QPoint(0,self.height()))
        return super(MyMenu,self).event(event)

if __name__ == "__main__":
    app = QtGui.QApplication([])
    w = QtGui.QWidget()
    w.setGeometry(100,100,500,500)
    tb = QtGui.QToolButton(w)
    tb.setText("HELLO")
    tb.setGeometry(70,70,40,30)
    m = MyMenu("Menu",tb)
    m.addAction("Exit")
    tb.setMenu(m)
    w.show()
    app.exec_()
like image 62
spikeynick Avatar answered Oct 16 '22 10:10

spikeynick


The position is hard-coded in the function void QToolButtonPrivate::popupTimerDone() in [Qt install directory]/src/gui/widgets/qtoolbutton.cpp. It seems pretty hard to override that, unless you implement your own popup menu from scratch.

like image 35
Johan Råde Avatar answered Oct 16 '22 10:10

Johan Råde