PyQt5 - 传递的引用是 None

PyQt5 - Passed reference is None

所以我是 Python 的新手。对于我的生活无法弄清楚为什么以下代码不起作用(我正在使用 PyQt5)。我基本上是在尝试在 stackedwidget 中放置 2 个小部件,以便我可以在它们之间切换。从 window 0 切换到 window 1 的按钮显然在 window 0 中。所以我需要能够以某种方式引用 stackedwidget。但是当我尝试将 stackedwidget 作为参考传递时,它抱怨变量是 None,即使情况不应该如此。

from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget, QGridLayout, QPushButton, QHBoxLayout, QVBoxLayout, QStackedWidget
from PyQt5.QtCore import QCoreApplication

class DeviceSelectionWindow(QWidget):
    def __init__(self, mainWindow):
        super().__init__()
        self.initUI()

    def initUI(self):
         testB = QPushButton("test",self)
#------------------------------------------------------------
class ModeSelectionWindow(QWidget):

    def __init__(self, mainWindow):
        super().__init__()
        self.mainWindow = mainWindow
        self.initUI()

    def initUI(self):
        recordButton = QPushButton("Record tutorial")
        watchButton = QPushButton("Watch tutorial")

        recordButton.setFixedSize(200,100)
        recordButton.setStyleSheet("font-size:30px")
        watchButton.setFixedSize(200,100)
        watchButton.setStyleSheet("font-size:30px")
        recordButton.clicked.connect(self.mainWindow.setCurrentIndex(1))
        #Add horizontal strech layout box (centered)
        hbox = QHBoxLayout()
        hbox.addWidget(recordButton)
        hbox.addWidget(watchButton)


        #Add vertical strech layout box (centered) 
        vbox = QVBoxLayout()
        vbox.addLayout(hbox)

        self.setLayout(vbox)

#------------------------------------------------------------
class MainWindow(QStackedWidget):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.initUI()


    def initUI(self):
        self.resize(1200,600)
        self.centerWindow()
        self.setWindowTitle("MultiPov Tutorial")

        modeSelectionWindow = ModeSelectionWindow(self)
        deviceSelectionWindow = DeviceSelectionWindow(self)

        self.addWidget(modeSelectionWindow)
        self.addWidget(deviceSelectionWindow)

        self.show()

    def centerWindow(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())



#------------------------------------------------------------

if __name__=='__main__':
    app = QApplication(sys.argv)
    mainWindow = MainWindow()
    sys.exit(app.exec_())

connect 方法接受一个函数名,你在里面做一个函数调用 return None.

recordButton.clicked.connect(self.mainWindow.setCurrentIndex(1))

解决这个问题的一种方法是编写一个完成工作的方法(更改索引)

def setWindow1(self):
    self.mainWindow.setCurrentIndex(1)

然后将该方法连接到 clicked 信号

recordButton.clicked.connect(self.setWindow1)

或者,使用一个lambda函数,一行搞定

recordButton.clicked.connect(lambda: self.mainWindow.setCurrentIndex(1))