Python 扩展QSpinBox上下文菜单
我觉得我到处都找遍了,但找不到答案。 想知道是否有办法将额外的QActions添加到QSpinBox上下文菜单? 最理想的情况是在行动列表的顶部 我知道您可以替换如下所示的默认菜单,但可以找出如何扩展:Python 扩展QSpinBox上下文菜单,python,python-2.7,pyqt,Python,Python 2.7,Pyqt,我觉得我到处都找遍了,但找不到答案。 想知道是否有办法将额外的QActions添加到QSpinBox上下文菜单? 最理想的情况是在行动列表的顶部 我知道您可以替换如下所示的默认菜单,但可以找出如何扩展: import sys from PyQt4 import QtGui, QtCore class QSpinBox(QtGui.QSpinBox): def __init__(self, *args, **kargs): QtGui.QSpinBox.__init__
import sys
from PyQt4 import QtGui, QtCore
class QSpinBox(QtGui.QSpinBox):
def __init__(self, *args, **kargs):
QtGui.QSpinBox.__init__(self, *args, **kargs)
self.resize(200, 60)
self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.customContextMenuRequested.connect(self.__contextMenu)
def __contextMenu(self):
self._normalMenu = self.build_menu()
self._normalMenu.exec_(QtGui.QCursor.pos())
def build_menu(self):
self.menu = QtGui.QMenu(self)
self.save = QtGui.QAction("Save", self)
self.menu.addAction(self.save)
self.reset = QtGui.QAction("Reset", self)
self.menu.addAction(self.reset)
return self.menu
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
form = QSpinBox()
form.show()
sys.exit(app.exec_())
默认菜单:
我想添加到顶部的选项:
提前感谢您的帮助
标记诀窍是使用
findChild()
和QTimer.singleShot()
在显示QMenu
后立即获取它:
from PyQt4 import QtCore, QtGui
class SpinBox(QtGui.QSpinBox):
def contextMenuEvent(self, event):
QtCore.QTimer.singleShot(0, self.on_timeout)
super(SpinBox, self).contextMenuEvent(event)
@QtCore.pyqtSlot()
def on_timeout(self):
menu = self.findChild(QtGui.QMenu, 'qt_edit_menu')
if menu is not None:
first_action = menu.actionAt(QtCore.QPoint())
save_action = QtGui.QAction(
"Save",
menu,
shortcut=QtGui.QKeySequence.Save,
triggered=self.on_save_triggered
)
reset_action = QtGui.QAction(
"Reset",
menu,
triggered=self.on_reset_triggered
)
menu.insertAction(first_action, save_action)
menu.insertAction(save_action, reset_action)
menu.insertSeparator(first_action)
@QtCore.pyqtSlot()
def on_save_triggered(self):
print("save")
@QtCore.pyqtSlot()
def on_reset_triggered(self):
print("reset")
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
w = SpinBox()
w.resize(600, w.sizeHint().height())
w.show()
sys.exit(app.exec_())