我正在尝试使用pyqt5来可视化回溯算法,并且我创建了一个类来在图形用户界面中进行更新时发出信号,但是每当我尝试调用发出信号的方法时,我都会得到一个错误,这是因为我使用QtCore.QMetaObject.invokeMethod来调用该方法,从我发现这个方法只调用qt已知的槽和方法,从that question中我发现我可以使用Q_INVOKABLE来解决这个问题,但我仍然不知道如何在python中做到这一点,下面是发出信号的类:
class signal_emitter(QtCore.QObject):
answer_signal = QtCore.pyqtSignal(int, int, str)
def solve(self, grid, row, column):
row, column = find_empty_cell(grid, row)
if (row, column) == (None,None):
return True
for num in range(1, 10):
if valid_row(grid[row], num
) and valid_column(grid, column, num
) and valid_box(grid, row, column, num):
grid[row][column] = num
self.answer_signal.emit(row, column, str(num))
if self.solve(grid, row, column):
return True
grid[row][column] = 0
self.answer_signal.emit(row, column, "0")
return False到目前为止,代码中的一切都很好,只是我不能在代码片段中调用名为( solve )的方法,因此我需要一种方法来使用Q_INVOKABLE或对类进行修改,以便可以调用一个将提前调用solve致谢的插槽方法
发布于 2021-04-17 14:03:16
在pyqt5的情况下,您必须使用pyqtSlot装饰器:
import random
from PyQt5 import QtCore
class signal_emitter(QtCore.QObject):
answer_signal = QtCore.pyqtSignal(int, int, str)
@QtCore.pyqtSlot(list, int, int, result=bool)
def solve(self, grid, row, column):
print("solve", grid, row, column)
self.answer_signal.emit(1, 1, "foo")
return random.choice([True, False])
obj = signal_emitter()
grid = [[1, 2], [3, 4]]
row = 0
column = 0
result = QtCore.QMetaObject.invokeMethod(
obj,
"solve",
QtCore.Qt.DirectConnection,
QtCore.Q_RETURN_ARG(bool),
QtCore.Q_ARG(list, grid),
QtCore.Q_ARG(int, row),
QtCore.Q_ARG(int, column),
)
print(result)输出:
solve [[1, 2], [3, 4]] 0 0
Truehttps://stackoverflow.com/questions/67135015
复制相似问题