首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PySide2 \查找哪个QKeySequence被按下2

PySide2 \查找哪个QKeySequence被按下2
EN

Stack Overflow用户
提问于 2019-03-16 10:57:46
回答 1查看 159关注 0票数 1

我之前有一个关于QKeySequence here的问题。它成功了,但是当我将它应用到我的代码中时,当QKeySequence出现在行后时,当按钮单击事件发生在QKeySequence行之前时,似乎出现了一个错误。

注意: GUI只包含两个按钮: self.btnDSR和self.btnOther。

从上一个问题中eyllanesc的回答来看,我的代码如下:

代码语言:javascript
复制
class MainWindow(QtWidgets.QMainWindow, test_mainWindow.Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.signals()

    @QtCore.Slot()
    def test_func(self):
        shorcut = self.sender()
        sequence = shorcut.key()
        print(sequence.toString())

    def btn_clicked(self):
        QtWidgets.QShortcut(QtGui.QKeySequence("3"), self, activated=self.test_func)
        print('Shortcut 3 now works!')  # But it doesn't

    def signals(self):
        QtWidgets.QShortcut(QtGui.QKeySequence("1"), self, activated=self.test_func)
        QtWidgets.QShortcut(QtGui.QKeySequence("2"), self, activated=self.test_func)
        QtCore.QObject.connect(self.btnDSR, QtCore.SIGNAL('clicked()'), self.btn_clicked)
        QtCore.QObject.connect(self.btnOther, QtCore.SIGNAL('clicked()'), self.close)

只输入1和2,在单击btnDSR后输入3不工作。这意味着数字3不是打印出来,而是数字1和2号是当点击。当按3时会返回此错误消息:

代码语言:javascript
复制
sequence = shorcut.key()
AttributeError: 'NoneType' object has no attribute 'key'

如果与此相关,我还会在这里附加用于测试GUI的基本代码:

代码语言:javascript
复制
from PySide2 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(440, 418)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.btnDSR = QtWidgets.QPushButton(self.centralwidget)
        self.btnDSR.setGeometry(QtCore.QRect(120, 110, 93, 28))
        self.btnDSR.setObjectName("btnDSR")
        self.btnOther = QtWidgets.QPushButton(self.centralwidget)
        self.btnOther.setGeometry(QtCore.QRect(150, 180, 141, 28))
        self.btnOther.setObjectName("btnOther")
        MainWindow.setCentralWidget(self.centralwidget)
        self.btnDSR.setText(QtWidgets.QApplication.translate("MainWindow", "DSR Button", None, -1))
        self.btnOther.setText(QtWidgets.QApplication.translate("MainWindow", "Other Button", None, -1))
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-16 17:15:51

使用PyQt5 (进行一些兼容性更改)进行同样的测试是正确的,因此我认为这是一个PySide2错误。解决方法是使用lambdafunctools.partial传递密钥。

1. lambda:

代码语言:javascript
复制
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.signals()

    @QtCore.Slot(str)
    def test_func(self, key):
        print(key)

    def btn_clicked(self):
        QtWidgets.QShortcut(QtGui.QKeySequence("3"), self, activated=  lambda key="3": self.test_func(key))
        print('Shortcut 3 now works!')  # But it doesn't

    def signals(self):
        QtWidgets.QShortcut(QtGui.QKeySequence("1"), self, activated=  lambda key="1": self.test_func(key))
        QtWidgets.QShortcut(QtGui.QKeySequence("2"), self, activated=  lambda key="2": self.test_func(key))
        QtCore.QObject.connect(self.btnDSR, QtCore.SIGNAL('clicked()'), self.btn_clicked)
        QtCore.QObject.connect(self.btnOther, QtCore.SIGNAL('clicked()'), self.close)

2. functools.partial

代码语言:javascript
复制
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)
        self.signals()

    @QtCore.Slot(str)
    def test_func(self, key):
        print(key)

    def btn_clicked(self):
        QtWidgets.QShortcut(QtGui.QKeySequence("3"), self, activated= partial(self.test_func, "3"))
        print('Shortcut 3 now works!')  # But it doesn't

    def signals(self):
        QtWidgets.QShortcut(QtGui.QKeySequence("1"), self, activated= partial(self.test_func, "1"))
        QtWidgets.QShortcut(QtGui.QKeySequence("2"), self, activated= partial(self.test_func, "2"))
        QtCore.QObject.connect(self.btnDSR, QtCore.SIGNAL('clicked()'), self.btn_clicked)
        QtCore.QObject.connect(self.btnOther, QtCore.SIGNAL('clicked()'), self.close)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55195979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档