从类导入时 PyQt5 按钮"clicked.connect()"不起作用



我正在为clicked.connect失败问题运行测试。

我想将CentralWidget中的所有小部件包装到一个名为React的类中。当我在CentralWidget中调用React时,会显示Buttonself.writeLineself.valLabel等小部件,但当我按下reactButton时,它不起作用,即根据self.writeLine更新self.valLabel

快照:按钮不工作

我怀疑

Button.clicked.connect(self.BottomPressedTest) # no function when pressed

没有做应该做的事。但不知道为什么会发生这种事。

整个测试代码如下所示,

from PyQt5 import QtCore, QtWidgets, QtGui
import sys

class CentralWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(CentralWidget, self).__init__(parent)

self.mainLayout = QtWidgets.QGridLayout()
self.setLayout(self.mainLayout)
panel = React(1).groupbox
self.mainLayout.addWidget(panel, 0, 0)

class React(QtWidgets.QGroupBox):
def __init__(self, ch):
self.value = 0
self.groupbox = QtWidgets.QGroupBox()
self.vbox = QtWidgets.QVBoxLayout()
self.groupbox.setLayout(self.vbox)
Button = QtWidgets.QPushButton('React')
Button.clicked.connect(self.BottomPressedTest) # no function when pressed
self.writeLine = QtWidgets.QSpinBox()#QLineEdit()
self.writeLine.setFont(QtGui.QFont('Arial', 16))
self.valLabel = QtWidgets.QLabel()
self.valLabel.setFont(QtGui.QFont('Arial', 20))
self.valLabel.setText(f'React: {self.value}')
self.vbox.addWidget(Button)
self.vbox.addWidget(self.valLabel)
self.vbox.addWidget(self.writeLine)
def BottomPressedTest(self):
print('React bottom pressed.')
self.valLabel.setText(f'React: {self.writeLine.text()}')

class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):

super(MainWindow, self).__init__(parent)
self.setWindowTitle(QtCore.QCoreApplication.applicationName())
self.centralWidget = CentralWidget()
self.setCentralWidget(self.centralWidget)

class MainApplication(QtWidgets.QApplication):
def __init__(self, argv: list):
super(MainApplication, self).__init__(argv)
self.mainWindow = MainWindow()
self.mainWindow.resize(200,200) 
self.mainWindow.raise_()
self.mainWindow.show()
def main():
application = MainApplication([])
sys.exit(application.exec_())
if __name__ == "__main__":
main()

编辑

我将React中的前几行更改为

class React(QtWidgets.QGroupBox):
def __init__(self, ch):
super().__init__()
self.value = 0
self.setStyleSheet('QGroupBox { color: white; border: 3px solid grey; }') #
self.vbox = QtWidgets.QVBoxLayout()
self.setLayout(self.vbox)

,然后将CentralWidget更改为

class CentralWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(CentralWidget, self).__init__(parent)

self.mainLayout = QtWidgets.QGridLayout()
self.setLayout(self.mainLayout)
panel = React(1)
self.mainLayout.addWidget(panel)

现在问题解决了。非常感谢@musicamante和@Passerby

React对象在CentralWidget.__init__结束时被丢弃,只保留QGroupBox。将其保存在属性中,您的问题就会得到解决。

请注意,React对象继承自QGroupBox,但不调用其__init__方法,而是创建一个新的QGroupBox作为成员。

最新更新