exibite777
@exibite777
Ведущий системный аналитик

PyQT. Почему не работает кнопка в дочернем окне?

PyQT 5.9.7
Собственно сам код
from PyQt5 import QtCore,QtWidgets
import sys

class childForm:
    def __init__(self,mainForm):
        self.form = QtWidgets.QWidget(mainForm,QtCore.Qt.Window)
        # self.form.setWindowModality(QtCore.Qt.WindowModal)
        self.form.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
        self.form.setWindowTitle("Дочернее окно")
        self.form.resize(300, 70)
        btnClose = QtWidgets.QPushButton("&Закрыть дочернее окно")
        vbox = QtWidgets.QVBoxLayout()
        vbox.addWidget(btnClose)
        self.form.setLayout(vbox)
        btnClose.clicked.connect(self.close_it_right_now)
        self.form.show()
    def close_it_right_now(self):
        self.form.close()
        
class MainForm:
    def __init__(self,app):
        self.form = QtWidgets.QWidget()
        self.form.setWindowTitle("Первая программа на PyQt")
        self.form.resize(500, 500)
        label = QtWidgets.QLabel("<center>Привет, мир!</center>")
        btnDock = QtWidgets.QPushButton("Открыть &дочернее окно")
        btnQuit = QtWidgets.QPushButton("&Закрыть программу")
        vbox = QtWidgets.QVBoxLayout()
        vbox.addWidget(label)
        vbox.addWidget(btnDock)
        vbox.addWidget(btnQuit)
        self.form.setLayout(vbox)
        btnDock.clicked.connect(self.child_window_show)
        btnQuit.clicked.connect(app.quit)
        self.form.show()
    def child_window_show(self):
        child_form=childForm(self.form)
    
def main():
    app = QtWidgets.QApplication(sys.argv)
    main_form=MainForm(app)
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

Вроде бы все по классике написано. Но почем-то в дочернем окне, кнопка не реагирует на нажатия
Консоль молчит. Что может быть не так?
  • Вопрос задан
  • 106 просмотров
Решения вопроса 1
seven5674
@seven5674
Старый я уже что бы что-то в себе менять
Если кратко то у тебя self и self.form ссылаются на разные объекты и соответственно не видят друг друга

self - <class '__main__.childForm'>
self.form - <class 'PyQt5.QtWidgets.QWidget'>


Полный и немного измененный пример

from PyQt5 import QtCore, QtWidgets
import sys


class child_form(QtWidgets.QWidget):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.setWindowFlags(QtCore.Qt.Window)
        self.setWindowModality(QtCore.Qt.WindowModal)
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
        self.setWindowTitle("Дочернее окно")
        self.resize(300, 70)
        btn_close = QtWidgets.QPushButton("&Закрыть дочернее окно")
        btn_close.clicked.connect(self.on_btn_close)
        vbox = QtWidgets.QVBoxLayout()
        vbox.addWidget(btn_close)
        self.setLayout(vbox)

    def show_window(self):
        self.show()

    def on_btn_close(self):
        self.close()


class main_form(QtWidgets.QWidget):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.setWindowTitle("Первая программа на PyQt")
        self.resize(500, 500)
        label = QtWidgets.QLabel("<center>Привет, мир!</center>")
        btn_modal = QtWidgets.QPushButton("Открыть &дочернее окно")
        btn_close = QtWidgets.QPushButton("&Закрыть программу")
        vbox = QtWidgets.QVBoxLayout()
        vbox.addWidget(label)
        vbox.addWidget(btn_modal)
        vbox.addWidget(btn_close)
        self.setLayout(vbox)
        btn_modal.clicked.connect(self.on_btn_modal)
        btn_close.clicked.connect(QtWidgets.qApp.quit)

    def show_window(self):
        self.show()

    def on_btn_modal(self):
        child = child_form(self)
        child.show_window()


def main():
    app = QtWidgets.QApplication(sys.argv)
    form = main_form()
    form.show_window()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы