QPushButton не работает при добавлении в Layout - PullRequest
1 голос
/ 09 октября 2019

У меня есть QWidget (который настроен как пользовательский интерфейс с именем Ui_Form), и я хочу, чтобы он был частью QFrame, который уже является частью моего QMainWindow;этот QWidget является формой пользовательского интерфейса с кнопками и другими объектами. Я попытался добавить его как часть макета фрейма, однако проблема в том, что QPushButtons, которые находятся в Ui_Form, перестают работать, когда я добавляю QWidget в макет, Мой код ниже.

## 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, который работал до добавления его в макет

## 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, но кнопки NOT работают, даже если я вызываю setupUiметод, который соединит кнопку с методом printHello. Есть идеи?

1 Ответ

0 голосов
/ 09 октября 2019

Объяснение:

Проблема в том, что my_form_ui - это локальная переменная, которая будет устранена, когда вы завершите выполнение метода setupUi(), поэтому метод printHello() больше не будет существовать. С QPushButton эта проблема не генерируется, потому что владельцем является GUI.

Решение:

Установить my_form_ui в качестве атрибута класса:

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