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))
所以我是 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))