我想以是否按下修饰键 (Ctrl) 为条件进行操作。我发现的一种解决方法是安装一个事件过滤器并用于QApplication.queryKeyboardModifiers()
检测何时Ctrl
被按下,并QApplication.keyboardModifiers()
检测何时Ctrl
被释放:
from PySide6.QtCore import Qt, Signal
from PySide6.QtWidgets import QApplication, QMainWindow
class MainWindow(QMainWindow):
ctrl_signal = Signal(bool)
def __init__(self):
QMainWindow.__init__(self)
self.installEventFilter(self)
self.ctrl_signal.connect(self.ctrl_slot)
def eventFilter(self, _object, e):
if QApplication.queryKeyboardModifiers() == Qt.CTRL: # This runs twice, and only on key press (not release)
print("Ctrl pressed")
self.ctrl_signal.emit(True)
elif QApplication.keyboardModifiers() == Qt.CTRL: # This runs once, but only on release
print("Ctrl released")
self.ctrl_signal.emit(False)
return False
def ctrl_slot(self, e):
print("e: ", e) # Do something
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
但是,我担心这是对.queryKeyboardModifiers()
and.keyboardModifiers()
函数的意外使用,因此以后可能会导致更多麻烦。是否有适当的方法来检测何时单独按下/释放修改键(即没有按下任何其他键)?
虽然我使用的是 PySide6,但如果它们有帮助,我会接受 C++ 或 PyQt 中的答案。