17

How can i make my qmenu checkable?

from PyQt4 import QtGui

app = QtGui.QApplication([])

menu = QtGui.QMenu()

menu.addAction('50%')
menu.addAction('100%')
menu.addAction('200%')
menu.addAction('400%')
menu.show()

app.exec_()
unice
  • 2,655
  • 5
  • 43
  • 78

3 Answers3

34

like this:

from PyQt4 import QtGui

app = QtGui.QApplication([])

w = QtGui.QMainWindow()
menu = QtGui.QMenu("menu", w)

menu.addAction(QtGui.QAction('50%', menu, checkable=True))
menu.addAction(QtGui.QAction('100%', menu, checkable=True))
menu.addAction(QtGui.QAction('200%', menu, checkable=True))
menu.addAction(QtGui.QAction('300%', menu, checkable=True))
menu.addAction(QtGui.QAction('400%', menu, checkable=True))

w.menuBar().addMenu(menu)
w.show()
app.exec_()

or witht radio buttons:

from PyQt4 import QtGui

app = QtGui.QApplication([])

w = QtGui.QMainWindow()
menu = QtGui.QMenu("menu", w)
ag = QtGui.QActionGroup(w, exclusive=True)

a = ag.addAction(QtGui.QAction('50%', w, checkable=True))
menu.addAction(a)

a = ag.addAction(QtGui.QAction('100%', w, checkable=True))
menu.addAction(a)

a = ag.addAction(QtGui.QAction('200%', w, checkable=True))
menu.addAction(a)

a = ag.addAction(QtGui.QAction('300%', w, checkable=True))
menu.addAction(a)

a = ag.addAction(QtGui.QAction('400%', w, checkable=True))
menu.addAction(a)

w.menuBar().addMenu(menu)
w.show()
app.exec_()
mata
  • 67,110
  • 10
  • 163
  • 162
  • thank you very much for all the sample answers. That solves my problem. :) – unice Apr 29 '12 at 03:00
  • 4
    I would add that you could use `myaction = QtGui.QAction('50%', menu, checkable=True)`, then `menu.addAction(myaction)` and eventually `myaction.isChecked()` to get the check status. – Giancarlo Sportelli Mar 20 '15 at 01:22
  • For anyone coming accross this thread, QActionGroup is [exclusive by default](https://doc.qt.io/qtforpython/PySide2/QtWidgets/QActionGroup.html) and you **do not** need to say ```exclusive=True``` – Carlos Medina Aug 22 '20 at 02:41
4

I suggest adding a few lines to the compact first solution to show the actual use of the buttons:

from PyQt4 import QtGui, QtCore

def isChecked(): 
    """ Prints selected menu labels. """ 
    [print(action.text()) for action in menu.actions() if action.isChecked()]

app = QtGui.QApplication([])
w = QtGui.QMainWindow()
menu = QtGui.QMenu("menu", w)

menu.addAction(QtGui.QAction('50%', menu, checkable=True))
menu.addAction(QtGui.QAction('100%', menu, checkable=True))
menu.addAction(QtGui.QAction('200%', menu, checkable=True))
menu.addAction(QtGui.QAction('400%', menu, checkable=True))

menu.triggered.connect(isChecked)

w.menuBar().addMenu(menu)
w.show()
app.exec_()
catox
  • 101
  • 2
0

Example for with submenu for PyQt5

from PyQt5.QtWidgets import (
    QMenu,
    QAction,
)

menu = QMenu()
color_menu = QMenu('Player color')
white_color = QAction('White', checkable=True)
black_color = QAction('Black', checkable=True)
color_menu.addAction(white_color)
color_menu.addAction(black_color)

play_action = QAction('Start game')
menu.addAction(play_action)
menu.addMenu(color_menu)
Most Wanted
  • 6,254
  • 5
  • 53
  • 70