Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.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 PyQt按键信号发送到不同类别的多个插槽_Python_Pyqt_Pyqt5 - Fatal编程技术网

Python PyQt按键信号发送到不同类别的多个插槽

Python PyQt按键信号发送到不同类别的多个插槽,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我有一个自定义表类,我想在其中绑定Return键以将编辑焦点推进到下一行,如下所示: import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * class App(QWidget): def __init__(self): super().__init__() # self.shortcut = QShortcut(QKe

我有一个自定义表类,我想在其中绑定Return键以将编辑焦点推进到下一行,如下所示:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

class App(QWidget):

    def __init__(self):
        super().__init__()

        # self.shortcut = QShortcut(QKeySequence('Return'), self)
        # self.shortcut.activated.connect(self.plotter)

        table = Table(1, 1)
        layout = QHBoxLayout()
        layout.addWidget(table)
        self.setLayout(layout)

        self.show()

    def plotter(self):
        print('I am plotting')

class Table(QTableWidget):

    def __init__(self, rows, cols):
        super().__init__(1, 1)

        self.shortcut = QShortcut(QKeySequence('Return'), self)
        self.shortcut.activated.connect(self.advance)

    def advance(self):
        print('I am advancing')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = App()

    sys.exit(app.exec_())

这很好用。但我还想将该返回键绑定到表所在的应用程序中的绘图例程。这样做的最终效果是点击返回键接受表格编辑并提升表格单元格焦点,然后更新由这些表格值确定的绘图


对于主应用程序类中的绘图例程,以相同的方式实现上述代码也可以很好地工作。但是我不能同时实现它们。当我将Return键绑定到两个单独类中的两个单独插槽时,当我点击Return时,什么也不会发生。有什么想法吗?谢谢。

激活的信号不会触发,因为正如文档所指出的,序列不明确,所以您应该使用该信号

void QShortcut::在调用键序列时激活空() 在键盘上输入时,据说是模棱两可的,只要 匹配多个快捷方式的开头。

当快捷方式的键序列完成时,activatedAmbiguously()将被激活 如果键序列仍然不明确(即,它是开始 一个或多个其他快捷方式)。未发出激活的()信号 在这种情况下

另请参见激活()

(强调矿山)

但不幸的是,它无法工作,因为它一次只拍摄一个,也就是说,首先是父对象的快捷方式(QWidget),然后是子对象的快捷方式(QTableWidget),它们不符合您的要求

因此,在这种情况下,一种可能的解决方案是将相同的信号连接到多个插槽:

class App(QWidget):
    def __init__(self):
        super().__init__()

        table = Table(1, 1)
        layout = QHBoxLayout(self)
        layout.addWidget(table)

        self.show()

        self.shortcut = QShortcut(QKeySequence("Return"), self)
        self.shortcut.activated.connect(self.plotter)
        self.shortcut.activated.connect(table.advance)

    def plotter(self):
        print("I am plotting")


class Table(QTableWidget):
    def __init__(self, rows, cols):
        super().__init__(1, 1)

    def advance(self):
        print("I am advancing")

总之,最好的解决方案是只使用QShorcut将所有插槽连接到同一信号。

提供一个更新的简单示例。@somethingvague您是否尝试连接到表格小部件的信号(可能在填充后)?我知道这不完全一样,但它可能就是你要找的。@musicamante,是的,我遇到的问题是绘图例程是主应用程序类的一部分,cellChanged信号只能连接到table类中的方法。但是我是PyQt的新手,所以我的理解可能不正确。@somethingvague如果您将您的努力包括在该方法中,可能会有所帮助。
class ReturnListener(QObject):
    pressed = pyqtSignal()

    def __init__(self, widget):
        super().__init__(widget)
        self._widget = widget
        self.widget.installEventFilter(self)

    @property
    def widget(self):
        return self._widget

    def eventFilter(self, o, e):
        if self.widget is o and e.type() == QEvent.KeyPress:
            if e.key() == Qt.Key_Return:
                self.pressed.emit()
        return super().eventFilter(o, e)


class App(QWidget):
    def __init__(self):
        super().__init__()

        table = Table(1, 1)
        layout = QHBoxLayout(self)
        layout.addWidget(table)

        listener = ReturnListener(self)
        listener.pressed.connect(self.plotter)

        self.show()

    def plotter(self):
        print("I am plotting")


class Table(QTableWidget):
    def __init__(self, rows, cols):
        super().__init__(1, 1)

        listener = ReturnListener(self)
        listener.pressed.connect(self.advance)

    def advance(self):
        print("I am advancing")