如何在右侧cilck的Qdoublespinbox上的QtCore.Qt.DefaultContextMenu中添加动作?

时间:2018-11-27 09:36:25

标签: python pyqt pyqt5 qdoublespinbox

我使用Qt Designer开发了一个相当复杂的GUI工具。

有关该工具的更多详细信息,请参见:https://github.com/3fon3fonov/trifon

我定义了许多QDoubleSpinBox条目,默认情况下,Qt Designer将其右键菜单策略设置为:

setContextMenuPolicy(QtCore.Qt.DefaultContextMenu)

现在,我想在此菜单中添加更多操作,但是我根本无法理解其工作原理! Qt Designer中没有任何东西可以让我创建“ CustomContextMenu”。我了解为此,我可能需要一些编码(需要帮助,因此我在这里寻求帮助),但是我还需要针对所有SpinBox-es使其全局化。

很抱歉,由于此表单的代码太大,因此无法发布。如果有兴趣,请查看“ gui.py”下的github。但是,在.ui文件中,没有迹象表明可以控制这些按钮的上下文菜单策略。 相反,我发布了该工具的图片(很抱歉,图片质量不佳,但是当单击鼠标右键并显示菜单时,PrtSc似乎不起作用)

在此处查看GUI图像

1 个答案:

答案 0 :(得分:1)

由于要向默认上下文菜单中添加QAction,因此我们首先覆盖contextMenuEvent事件,然后使用QTimer来调用过滤toplevels和得到显示的QMenu,然后在其中添加QAction

doublespinbox.py

from PyQt5 import QtCore, QtWidgets

class DoubleSpinBox(QtWidgets.QDoubleSpinBox):
    minimize_signal = QtCore.pyqtSignal()

    def __init__(self, *args, **kwargs):
        super(DoubleSpinBox, self).__init__(*args, **kwargs)
        self.setContextMenuPolicy(QtCore.Qt.DefaultContextMenu)

    def contextMenuEvent(self, event):
        QtCore.QTimer.singleShot(0, self.add_actions)
        super(DoubleSpinBox, self).contextMenuEvent(event)

    @QtCore.pyqtSlot()
    def add_actions(self):
        for w in QtWidgets.QApplication.topLevelWidgets():
            if isinstance(w, QtWidgets.QMenu) and w.objectName() == "qt_edit_menu":
                w.addSeparator()
                minimize_action = w.addAction("minimize this parameter")
                minimize_action.triggered.connect(self.minimize_signal)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = DoubleSpinBox()
    w.show()
    sys.exit(app.exec_())

要在Qt Designer中使用DoubleSpinBox,请首先在.ui旁边放置 doublespinbox.py

├── ..
├── rvmod_gui.ui
├── doublespinbox.py   
├── ...

然后,您必须对窗口小部件进行升级,以右键单击QDoubleSpinBox并通过在对话框中添加以下内容来选择“升级为...”选项:

enter image description here

然后单击“添加”按钮,然后单击“升级”按钮。

对于其他QDoubleSpinBox,请右键单击并选择DoubleSpinBox选项所在的新的Promote To选项。


您可以找到示例here