【问题标题】:extending QSpinBox ContextMenu扩展 QSpinBox ContextMenu
【发布时间】:2019-07-27 07:33:17
【问题描述】:

感觉好像我到处找,但找不到答案。 想知道是否有办法向 QSpinBox ContextMenu 添加额外的 QActions? 理想情况下位于操作列表的顶部。

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

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_())

默认菜单:

我想添加到顶部的选项:

提前感谢您的帮助,

标记

【问题讨论】:

    标签: python python-2.7 pyqt


    【解决方案1】:

    诀窍是在使用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_())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多