Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 复杂上下文菜单子菜单_Python_Pyqt_Pyqt5_Contextmenu - Fatal编程技术网

Python 复杂上下文菜单子菜单

Python 复杂上下文菜单子菜单,python,pyqt,pyqt5,contextmenu,Python,Pyqt,Pyqt5,Contextmenu,我有一个主要由上下文菜单驱动的Qt5应用程序 现在我有一个标准的结构,包括菜单、子菜单和动作 我想添加一个带有几个输入小部件的小对话框来代替子菜单,如下所示: 有没有什么(可能很简单的)方法可以做到这一点 我知道我可以从弹出窗口打开一个普通对话框,但这不是我的意思。 我想有正常的子菜单行为,有机会回到父菜单。。。如果可能的话 注意:我实际上使用的是PyQt5,但我认为这是一个更一般的Qt问题。按照@G.m.的建议,我能够部分解决我的问题 我的代码当前代码如下所示: #!/usr/bin/pyt

我有一个主要由上下文菜单驱动的Qt5应用程序

现在我有一个标准的结构,包括菜单、子菜单和动作

我想添加一个带有几个输入小部件的小对话框来代替子菜单,如下所示:

有没有什么(可能很简单的)方法可以做到这一点

我知道我可以从弹出窗口打开一个普通对话框,但这不是我的意思。 我想有正常的子菜单行为,有机会回到父菜单。。。如果可能的话


注意:我实际上使用的是PyQt5,但我认为这是一个更一般的Qt问题。

按照@G.m.的建议,我能够部分解决我的问题

我的代码当前代码如下所示:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *


class ActionFont(QWidgetAction):
    def __init__(self, parent: QWidget, target: QPlainTextEdit):
        super(ActionFont, self).__init__(parent)
        self.setIcon(QIcon("font-face.svg"))
        self.setText("Face")
        w = QFontComboBox()
        w.currentFontChanged.connect(self.doit)
        self.setDefaultWidget(w)
        self.cursor = target.textCursor()
        self.char_format = self.cursor.charFormat()
        font = self.char_format.font()
        w.setCurrentFont(font)
        # self.triggered.connect(self.doit)

    def doit(self, font):
        self.char_format.setFont(font)
        self.cursor.setCharFormat(self.char_format)


class ActionSize(QWidgetAction):
    def __init__(self, parent: QWidget, target: QPlainTextEdit):
        super(ActionSize, self).__init__(parent)
        self.setIcon(QIcon("font-size.svg"))
        self.setText("Size")
        self.has_changed = False
        w = QSpinBox()
        self.setDefaultWidget(w)
        self.cursor = target.textCursor()
        self.char_format = self.cursor.charFormat()
        font = self.char_format.font()
        size = font.pointSize()
        w.setRange(6, 100)
        w.setValue(size)
        w.valueChanged.connect(self.doit)
        w.editingFinished.connect(self.quit)

    def doit(self, size):
        print(f'ActionSize.doit({size})')
        self.char_format.setFontPointSize(size)
        self.cursor.setCharFormat(self.char_format)
        self.has_changed = True

    def quit(self):
        print(f'ActionSize.quit()')
        if self.has_changed:
            print(f'ActionSize.quit(quitting)')


class Window(QMainWindow):
    def __init__(self, parent=None):
        from lorem import text
        super().__init__(parent)
        self.text = QPlainTextEdit(self)
        self.setCentralWidget(self.text)

        self.text.setContextMenuPolicy(Qt.CustomContextMenu)
        self.text.customContextMenuRequested.connect(self.context)

        self.text.appendPlainText(text())

        self.setGeometry(100, 100, 1030, 800)
        self.setWindowTitle("Writer")

    def context(self, pos):
        m = QMenu(self)
        w = QComboBox()
        w.addItems(list('ABCDE'))
        wa = QWidgetAction(self)
        wa.setDefaultWidget(w)
        m.addAction('Some action')
        m.addAction(wa)
        m.addAction('Some other action')
        sub = QMenu(m)
        sub.setTitle('Font')
        sub.addAction(ActionFont(self, self.text))
        sub.addAction(ActionSize(self, self.text))
        m.addMenu(sub)

        pos = self.mapToGlobal(pos)
        m.move(pos)
        m.show()


app = QApplication([])

w = Window()
w.show()

app.exec()
这有一些限制:

  • 如果我尝试添加,我可以使用
    setDefaultWidget()
    添加一个小部件 添加填充
    QWidget
    或容器(例如:
    QFrame
    )菜单中不显示任何内容
  • 因此,我无法为小部件预先添加图标(或
    QLabel
  • 小部件的行为不像菜单项(激活时不会关闭);我在
    ActionSize
    中尝试克服这一点,但看起来相当笨拙,我不确定这是否正确
因此,我不会接受我自己的答案,希望有人能将其细化到足够有用的程度。

可能就是您想要的。