2017-09-16 5 views
0

Ich habe zwei Widgets (QMainWindow als win_one und QDialog als win_zwei) mit qtdesigner und PyQt5 erstellt. Von win_one, öffne ich win_zwei, fülle die lineEdit aus und drücke OK, um den Eintrag in eine label in win_one angezeigt zu übertragen. Alles funktioniert gut, außer zwei Probleme:Verbindung zwischen QDialog und QMainWindow - PyQt5

  1. win_one Fenster als .showMaximized() geöffnet wird aber nach ausgefüllten in dem Etikett, die Dimension des Fensters ändert.
  2. die Taste von win_one stoppt

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_()) 

back.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_()) 

Thank yo zu arbeiten u

+0

python27 oder python3? kann nicht Bug # 1 mit Python35 reproduzieren – ingvar

+0

Ich habe mit beiden Python getestet und ich kann den ersten Fehler nicht reproduzieren. – eyllanesc

Antwort

1

Ihr Code hat einige Inkonsistenzen:

  1. Sie sollten diese dialog = QMainWindow() nicht tun, da es genug, um ein Objekt der Klasse win_one zu erstellen, für diese Sie self.setupUi(dialog)-self.setupUi(self) ändern müssen.

  2. Mit der Anweisung win_one().label.setText(entry) Sie ein neues Objekt erstellen, die nicht notwendig ist, außer dass Sie das vorherige Objekt zu verlieren, so wenn Sie das Fenster erneut drücken, QDialog nicht geöffnet wird, ist eine einfache Lösung, die es als Eltern zu übergeben win_one zu win_two und verwenden Sie die self.parent() Funktion, um darauf zuzugreifen.

Alle oben genannten wird im folgenden Teil umgesetzt:

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_()) 

Hinweis: Ich konnte nie den ersten Fehler reproduzieren, nur die zweite.

Verwandte Themen