Связь между QDialog и QMainWindow - PyQt5

Я создал два виджета (QMainWindow как win_one и QDialog как win_two) с qtdesigner и PyQt5. В win_one я открываю win_two, заполняю lineEdit и нажимаю OK, чтобы перенести запись в label, отображаемый в win_one. Все работает хорошо, кроме двух проблем:

  1. Окно win_one открывается как .showMaximized(), но после заполнения метки размер окна меняется.
  2. кнопка от win_one перестает работать

front_win_one.py

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_win_one(object):
    def setupUi(self, win_one):
        win_one.setObjectName("win_one")
        win_one.resize(1147, 234)
        self.centralwidget = QtWidgets.QWidget(win_one)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(50, 50, 111, 51))
        self.pushButton.setObjectName("pushButton")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(40, 160, 131, 31))
        self.label.setObjectName("label")
        win_one.setCentralWidget(self.centralwidget)

        self.retranslateUi(win_one)
        QtCore.QMetaObject.connectSlotsByName(win_one)

    def retranslateUi(self, win_one):
        _translate = QtCore.QCoreApplication.translate
        win_one.setWindowTitle(_translate("win_one", "MainWindow"))
        self.pushButton.setText(_translate("win_one", "To qdialog"))
        self.label.setText(_translate("win_one", "TextLabel"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    win_one = QtWidgets.QMainWindow()
    ui = Ui_win_one()
    ui.setupUi(win_one)
    win_one.show()
    sys.exit(app.exec_())

front_win_two.py

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_win_two(object):
    def setupUi(self, win_two):
        win_two.setObjectName("win_two")
        win_two.resize(317, 278)
        self.pushButton = QtWidgets.QPushButton(win_two)
        self.pushButton.setGeometry(QtCore.QRect(40, 120, 121, 23))
        self.pushButton.setObjectName("pushButton")
        self.lineEdit = QtWidgets.QLineEdit(win_two)
        self.lineEdit.setGeometry(QtCore.QRect(30, 50, 161, 21))
        self.lineEdit.setObjectName("lineEdit")

        self.retranslateUi(win_two)
        QtCore.QMetaObject.connectSlotsByName(win_two)

    def retranslateUi(self, win_two):
        _translate = QtCore.QCoreApplication.translate
        win_two.setWindowTitle(_translate("win_two", "Dialog"))
        self.pushButton.setText(_translate("win_two", "OK"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    win_two = QtWidgets.QDialog()
    ui = Ui_win_two()
    ui.setupUi(win_two)
    win_two.show()
    sys.exit(app.exec_())

назад.py

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QDialog
from front_win_1 import Ui_win_one
from front_win_2 import Ui_win_two

class win_two(QDialog, Ui_win_two):
    def __init__(self, parent=None):
        super(win_two, self).__init__(parent)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.vers_main)

    def vers_main(self):
        entry = self.lineEdit.text()
        win_one().label.setText(entry)

class win_one(QMainWindow, Ui_win_one):
    def __init__(self, parent=None):
        super(win_one, self).__init__(parent)
        self.setupUi(dialog)
        self.pushButton.clicked.connect(self.open_qdialog)

    def open_qdialog(self):
        self.dialog_win_2 = win_two()
        self.dialog_win_2.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    dialog = QMainWindow()
    prog = win_one(dialog)
    dialog.showMaximized()
    sys.exit(app.exec_())

Спасибо


person H. Dave    schedule 16.09.2017    source источник
comment
питон27 или питон3? не могу воспроизвести ошибку № 1 с python35   -  person ingvar    schedule 16.09.2017
comment
Я тестировал оба python, и я не могу воспроизвести первую ошибку.   -  person eyllanesc    schedule 16.09.2017


Ответы (1)


В вашем коде есть некоторые несоответствия:

  1. Не стоит этого делать dialog = QMainWindow(), так как достаточно создать объект класса win_one, для этого надо поменять self.setupUi(dialog) на self.setupUi(self).

  2. С оператором win_one().label.setText(entry) вы создаете новый объект, который не нужен, кроме того, что вы теряете предыдущий объект, поэтому, когда вы снова нажимаете окно, QDialog не открывается, простое решение - передать его как родитель для win_one в win_two и используйте функцию self.parent() для доступа к нему.

Все вышеперечисленное реализовано в следующей части:

class win_two(QDialog, Ui_win_two):
    def __init__(self, parent=None):
        super(win_two, self).__init__(parent)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.vers_main)

    def vers_main(self):
        entry = self.lineEdit.text()
        self.parent().label.setText(entry)

class win_one(QMainWindow, Ui_win_one):
    def __init__(self, parent=None):
        super(win_one, self).__init__(parent)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.open_qdialog)

    def open_qdialog(self):
        self.dialog_win_2 = win_two(self)
        self.dialog_win_2.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    prog = win_one()
    prog.showMaximized()
    sys.exit(app.exec_())

Примечание. Мне не удалось воспроизвести первую ошибку, только вторую.

person eyllanesc    schedule 16.09.2017