【问题标题】:QMetaObject::invokeMethod: No such method signal_emitter::solveQMetaObject::invokeMethod:没有这样的方法 signal_emitter::solve
【发布时间】:2021-04-17 05:34:17
【问题描述】:

我正在尝试使用 pyqt5 对回溯算法进行可视化,并且我创建了一个类来在 GUI 中进行更新时发出信号,但每当我尝试调用发出信号的方法时,我都会得到一个错误,那是因为我使用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

到目前为止,代码中的所有内容都很好,只是我无法调用代码 sn-p 中称为 (solve) 的方法,因此我需要一种使用 Q_INVOKABLE 的方法或对类进行修改,以便我可以调用一个可以调用solve的槽方法 提前致谢

【问题讨论】:

    标签: python python-3.x pyqt pyqt5


    【解决方案1】:

    对于 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
    True
    

    【讨论】:

    • 所以该方法可以是一个插槽并发出自定义信号?好吧,我不知道,谢谢
    • @AhmadHamdy 如果回答对您有帮助,请不要忘记标记为正确,如果您不知道该怎么做,请查看stackoverflow.com/tour
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 2021-07-11
    • 2016-12-20
    • 1970-01-01
    相关资源
    最近更新 更多