QPushButton 添加到 Layout 后不起作用

QPushButton does not work when added to Layout

我有一个 QWidget(设置为 UI,名为 Ui_Form),我希望它成为 QFrame 的一部分,而 QFrame 已经是我的 QMainWindow 的一部分;这个 QWidget 是一个带有按钮和其他对象的 UI 表单。我试图将它添加为框架布局的一部分,但问题是当我将 QWidget 添加到布局时,Ui_Form 中的 QPushButtons 停止工作,我的代码如下。

## My QMainWindow
from PyQt5 import QtCore, QtGui, QtWidgets

class MainWindow(object):
    def setupUi(self, mainWindow):
        # pyuic5 code here ...
        self.MyFrame = QtWidgets.QFrame(self.centralwidget)
        self.MyFrame.setGeometry(QtCore.QRect(0, 560, 1201, 201))
        self.MyFrame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.MyFrame.setFrameShadow(QtWidgets.QFrame.Raised)
        #  more pyuic5 code here ...

        my_form = QtWidgets.QWidget()
        my_form_ui = Ui_Form()
        my_form_ui.setupUi(my_form)
        frame_layout = QtWidgets.QVBoxLayout()
        frame_layout.addWidget(my_form)
        self.MyFrame.setLayout(frame_layout)

我的 Ui_Form class,在将其添加到布局之前可以正常工作

## My Ui_Form class
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Form(object):
    def setupUi(self, form):
        # some pyuic5 code here ...
        self.myPushButton = QtWidgets.QPushButton(form)
        self.myPushButton.setGeometry(QtCore.QRect(415, 200, 101, 40))
        self.myPushButton.setObjectName("myPushButton")
        self.myPushButton.clicked.connect(self.printHello) 

    def printHello(self):
        print("Hello World!")

MainWindow 会很好地显示 Ui_Form 中的所有元素,但是按钮 不能 工作,尽管我调用了 setupUi 方法,它将按钮连接到 printHello 方法。有任何想法吗?

解释:

问题是my_form_ui是一个局部变量,当你执行完setupUi()方法时,它会被消除,所以printHello()方法将不复存在。使用 QPushButton 不会产生该问题,因为所有权是 GUI。

解决方案:

my_form_ui 设置为 class 的属性:

# ...
my_form = QtWidgets.QWidget()
<b>self.my_form_ui = Ui_Form()
self.my_form_ui.setupUi(my_form)</b>
frame_layout = QtWidgets.QVBoxLayout()
# ...