我有一个使用Pyside2创建的表单。
我有一个QCombobox,它的形式也有一个QToolbutton。如果触发,QToolbutton具有使用Escape键关闭窗口的快捷方式。
当我的组合框显示它的弹出并按Escape键时,表单也关闭了。
我想要的是当Combobox弹出显示并按Escape时,它只隐藏弹出窗口,而不是关闭窗口。
我怎么能这么做?
下面是代码的示例:
import sys
from PySide2.QtCore import Qt
from PySide2.QtGui import QKeySequence
from PySide2.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QComboBox, QToolButton, QShortcut
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
layout = QVBoxLayout()
toolbutton = QToolButton()
toolbutton.setText("Press Esc to close window")
toolbutton.setShortcut(QKeySequence(Qt.Key_Escape))
toolbutton.clicked.connect(self.close)
combobox = QComboBox()
combobox.addItems("A")
combobox.addItems("B")
combobox.addItems("C")
layout.addWidget(toolbutton)
layout.addWidget(combobox)
w = QWidget()
w.setLayout(layout)
self.setCentralWidget(w)
self.show()
app = QApplication(sys.argv)
window = MainWindow()
app.exec_()
发布于 2022-11-04 04:44:18
不要为此使用快捷方式,因为它的激活优先级太高。只有在没有其他小部件想要的情况下,窗口才必须接收事件。QDialog
会自动处理这个问题,但是如果不能使用,一个简单的解决方案就是覆盖窗口的keyPressEvent
。
下面是一个基于您的示例的演示:
import sys
from PySide2.QtCore import Qt
from PySide2.QtGui import QKeySequence
from PySide2.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QComboBox, QToolButton, QShortcut
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
layout = QVBoxLayout()
# DO NOT SET A SHORTCUT ON THIS BUTTON
toolbutton = QToolButton()
toolbutton.setText("Press Esc to close window")
toolbutton.clicked.connect(self.close)
combobox = QComboBox()
combobox.addItem("A")
combobox.addItem("B")
combobox.addItem("C")
layout.addWidget(toolbutton)
layout.addWidget(combobox)
w = QWidget()
w.setLayout(layout)
self.setCentralWidget(w)
self.show()
def keyPressEvent(self, event):
# handle escape/cancel key
if event.matches(QKeySequence.Cancel):
self.close()
app = QApplication(sys.argv)
window = MainWindow()
app.exec_()
https://stackoverflow.com/questions/74312047
复制相似问题