根据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函数解决特定的单元格信号?否则,触发特定单元格点击信号的解决方法是什么?
答案 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特定情况的答案,回答了我的问题。