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