正确使用PyQt信号

3 投票
1 回答
1225 浏览
提问于 2025-04-15 21:30

不久前,我在用C++做Qt的工作,现在我在用PyQt。

我有一个QStackedWidget的子类,里面有一个QWidget的子类。在这个QWidget里,我想点击一个按钮,跳转到QStackedWidget的下一页。我的(简化版的)做法如下:

class Stacked(QtGui.QStackedWidget):
    def __init__(self, parent=None):
        QtGui.QStackedWidget.__init__(self, parent)
        self.widget1 = EventsPage()
        self.widget1.nextPage.connect(self.nextPage)
        self.widget2 = MyWidget()
        self.addWidget(self.widget1)
        self.addWidget(self.widget2)

    def nextPage(self):
        self.setCurrentIndex(self.currentIndex() + 1)


class EventsPage(QtGui.QWidget):
    nextPage = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.continueButton = QtGui.QPushButton('Continue')
        self.continueButton.clicked.connect(self.nextPage)

基本上,我是把continueButton的clicked信号连接到EventsPage的nextPage信号,然后再把这个信号连接到Stacked里的nextPage方法。我本可以直接去EventsPage里连接self.widget1.continueButton.clicked,但那样似乎就完全违背了信号和槽的设计初衷。

所以,这种做法合理吗?还是说有更好的方法?

1 个回答

6

不,这个说法很有道理。可以把信号想象成在高楼上挥手的人。他们不想过马路(那些楼梯太麻烦了……),所以他们会观察其他楼上的人们在做什么。这样一来,大家就不需要关心楼里发生了什么事情。

撰写回答