首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展QSpinBox ContextMenu

扩展QSpinBox ContextMenu
EN

Stack Overflow用户
提问于 2019-03-06 02:41:52
回答 1查看 259关注 0票数 2

我觉得我已经找遍了所有地方,但还是找不到答案。我想知道是否有一种方法可以向QSpinBox ContextMenu添加额外的QActions?理想情况下,放在动作列表的顶部。

我知道你可以替换默认菜单,如下所示,但我知道如何扩展:

代码语言:javascript
复制
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_())

默认菜单:

我想要添加到顶部的选项:

提前感谢你的帮助,

标记

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-06 03:41:24

诀窍是在QMenu显示后立即使用findChild()QTimer.singleShot()获取它

代码语言:javascript
复制
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_())
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55009488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档