繁体   English   中英

无法连接pyQTSignal

[英]Can't connect pyQTSignal

是我的一部分代码。 我有两个类CheckerScene和Checkers。 Chesckers-是我的主要窗口。 我无法实现CheckerScene类中定义的EndGameSignal。 当它发出时,pySlot不能像我想要的那样在Checkers类中捕获它。 当EndGameSignal退出时-我想在主屏幕上看到对话框消息(在代码中实现pyQtSlots函数),而不是在现场。 我该如何纠正我的程序来做到这一点。

class CheckerScene(QtWidgets.QGraphicsScene): EndGameSignal=QtCore.pyqtSignal('QString') def init (self): QtWidgets.QGraphicsScene. init (self) # scene congifuratios self.setSceneRect(margin, margin, gridCount * gridSlotSize, gridCount * gridSlotSize) self.addRect(self.sceneRect())

    # create signal . It will be emit() from blackboard.crash()
    self.signaldel.connect(self.del_item)

    #choosing the visual checker and its coordinates
    self.current = None

    #list of grids and checkers
    self.grid = []
    self.white_checkers = []
    self.black_checkers = []
    for row in range(8):
        for column in range(8):
            # this is a "trick" to make the grid creation easier: it creates
            # a grid square only if the row is odd and the column is even,
            # and viceversa.
            if (not row & 1 and column & 1) or (row & 1 and not column & 1):
                # create a gridItem with a rectangle that uses 0-based
                # coordinates, *then* we set its position
                gridItem = self.addRect(0, 0, gridSlotSize, gridSlotSize)
                gridItem.setPos(margin + column * gridSlotSize, margin + row * gridSlotSize)
                gridItem.setBrush(QtGui.QColor(QtCore.Qt.lightGray))
                self.grid.append(gridItem)
                if 3 <= row <= 4:
                    # don't add checkers in the middle
                    continue
                # create checkers being careful to assign them the gridItem
                # as a *parent*; their coordinate will *always* be relative
                # to the parent, so that if we change it, they will always
                # be centered
                if row < 3:
                    self.black_checkers.append(CheckerItem(0, gridItem))#!
                else:
                    self.white_checkers.append(CheckerItem(1, gridItem))#!

    self.additionsl__init__()
    self.EndGameSignal.connect(Checkers.handler_EndGameSignal)
    self.EndGameSignal.emit('=NAME')

class Checkers(QtWidgets.QWidget):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        self.Initialization()


def Initialization(self):
    layout = QtWidgets.QGridLayout()
    self.setLayout(layout)

    self.player2Label = QtWidgets.QLabel('Player 2')
    layout.addWidget(self.player2Label)
    self.player2Label.setAlignment(QtCore.Qt.AlignCenter)

    self.checkerView = QtWidgets.QGraphicsView()
    layout.addWidget(self.checkerView)
    self.checkerScene = CheckerScene()
    self.checkerView.setScene(self.checkerScene)
    self.checkerView.setFixedSize(gridSize, gridSize)
    # set the Antialiasing render hints to paint "smoother" shapes
    self.checkerView.setRenderHints(QtGui.QPainter.Antialiasing)

    self.player1Label = QtWidgets.QLabel('Player 1')
    layout.addWidget(self.player1Label)
    self.player1Label.setAlignment(QtCore.Qt.AlignCenter)

@QtCore.pyqtSlot(str)
def handler_EndGameSignal(self, result):
    result=QtWidgets.QMessageBox.question(self,f"Выиграл {result}","Сиграть еще раз ?",QtWidgets.QMessageBox.Yes |
                                         QtWidgets.QMessageBox.No,QtWidgets.QMessageBox.No)
    if result == QtWidgets.QMessageBox.Yes :
        self.close()
    else :
        pass

    print(f"WINNER {result}")


@QtCore.pyqtSlot(bool)
def handler_EndGameSignal(self, result):
    result = QtWidgets.QMessageBox.question(self, f"НИЧЬЯ !", "Сиграть еще раз ?",
                                           QtWidgets.QMessageBox.Yes |
                                           QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No)
    if result == QtWidgets.QMessageBox.Yes:
        self.close()
    else:
        pass
    print("DRAW")

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    checkers = Checkers()
    checkers.show()
    sys.exit(app.exec_())

与上一个问题一样,您仍在混淆类和实例。 在代码中,您将信号连接到 ,而必须将其连接到实例

由于您没有参考发送者(场景)的接收者(Checker实例),因此必须将其与前者连接:

class Checkers(QtWidgets.QWidget):
    def Initialization(self):
        # ...
        self.checkerScene.EndGameSignal.connect(self.handler_EndGameSignal)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM