如何在PyQt5(PySide2)中将参数传递给QTableWidget表单元信号?

时间:2019-11-26 08:09:39

标签: pyqt pyqt5 pyside2

根据API,假设QTableWidget的面向PyQt5或PySide单元的信号分别接收行和列的两个整数参数。例如:

def cellClicked (row, column)

现在,当我尝试这样称呼他们时:

table=QTableWidget(5,5)

def slotCellClick1():
    print('something')

table.cellClicked(0,0).connect(slotCellClick1)

,我得到TypeError: native Qt signal is not callable

到目前为止,示例中描述的编译解决方案都采用这种方式:

table.cellClicked.connect(slotCellClick1)

通常适用于单元格点击。

我弄错了这个概念,还是仍然可以使用此api函数解决特定的单元格信号?否则,触发特定单元格点击信号的解决方法是什么?

2 个答案:

答案 0 :(得分:1)

这不是信号和插槽的工作方式。

工具包和一般的API使用回调来通知程序员何时发生某些事情,方法是调用一个函数对其进行响应。这种方法通常提供一个可以在通知中传递一些参数的接口。

假设您有一个模块,该模块可以在某个点上更改“某些内容”,您希望在更改发生时得到通知,并最终对其进行操作:

# pseudo code
from some_api import some_object

def some_function(argument):
    print("Something changed to {}!".format(argument))

some_object.set_something_changed_callback(some_function)

>>> some_object.change_something(True)
Something changed to True!

如您所见,something_changed_callback与“ something”的可能值无关,因为无论如何都会调用回调。如果您想对特定值“某物”做出反应,则必须在回调函数中进行检查。

对于更简单的api,通常最好在每种可能的情况下使用set_*_changed_callback(),而在像Qt这样的复杂工具包中则不需要(添加数千个功能,每个信号一个功能)并且令人困惑。
Qt(与其他工具包(如Gtk)一样)使用类似的回调技术,但具有统一的接口将所有信号连接到其“回调”。至少从编码的角度来看,这个概念并没有太大的改变,但是它使事情变得更容易。
最初,语法是这样的:

QObject.connect(some_object, SIGNAL("something_changed(bool)", some_function)

但由于几年以来,它已简化为“新样式”连接:

some_object.something_changed.connect(some_function)

与上面的几乎相同:

some_object.set_something_changed_callback(some_function)

因此,长话短说,您无法连接到特定的信号“结果”,必须自己检查。

我可以理解您的观点:“我有兴趣仅在值为x / y / z时才致电我的广告位”。这是有道理的,但是从api实现的角度来看,这种接口可能会出现问题。
最重要的是,许多信号发出的对象是类实例(QModelIndex,QStandardItem等),这些对象是在运行时创建的,甚至在您必须连接它们时还没有父对象,或者是可变对象(可能需要检查列表或字典是否与发出的列表相等相同)。
同样,一些信号具有多个参数,一个信号可能只对其中一个或多个信号感兴趣,但是使用简单的函数参数几乎不可能创建这种检查,而不会出现错误或异常。假设无论列是1,无论何时行,您都想连接到cellClicked。您可能会认为一种好方法是使用cellClicked(None, 1)cellClicked(False, 1)cellClicked(-1, 1),但是有些信号实际上返回None,False或-1,因此不会出现告诉“忽略该参数”的简单标准化方法(如果不使用自定义type)。

答案 1 :(得分:0)

搜索后,我找到了针对cellDoubleClicked https://stackoverflow.com/a/46738897/3597222特定情况的答案,回答了我的问题。