I know this question was answered some time 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 position of the menu to QToolButton. You must subclass QMenu and override the event function. When there is a show event, just reposition the menu.
Here is a simple example of 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_()
source share