Danke für deine Hilfe, jerch!
Ich hab deinen Vorschlag mal in einer kleinen Testanwendung umgesetzt und es funktioniert!
Die Testanwendung zeigt ein Hauptfenster mit einem "Add name"- und einem "Exit"-Button. Klickt man auf "Add name", öffnet sich ein Dialog, in den man einen Namen eintragen kann. Wenn auf "Submit" geklickt wird, wird in einem ausgegrauten Edit-Feld im Hauptfenster die Liste der eingegebenen Namen aktualisiert. Zum Debuggen hab ich noch für jede Aktion eine Ausgabe auf der Konsole erstellt.
Ich hab das Ganze wie folgt umgesetzt:
mainwindow.py (mit Qt Designer erstellt):
Code: Alles auswählen
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'mainwindow.ui'
#
# Created by: PyQt5 UI code generator 5.8.1
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(294, 124)
self.centralWidget = QtWidgets.QWidget(MainWindow)
self.centralWidget.setObjectName("centralWidget")
self.gridLayout_3 = QtWidgets.QGridLayout(self.centralWidget)
self.gridLayout_3.setContentsMargins(11, 11, 11, 11)
self.gridLayout_3.setSpacing(6)
self.gridLayout_3.setObjectName("gridLayout_3")
self.gridLayout = QtWidgets.QGridLayout()
self.gridLayout.setContentsMargins(11, 11, 11, 11)
self.gridLayout.setSpacing(6)
self.gridLayout.setObjectName("gridLayout")
self.MainWindow_Label_Name = QtWidgets.QLabel(self.centralWidget)
self.MainWindow_Label_Name.setObjectName("MainWindow_Label_Name")
self.gridLayout.addWidget(self.MainWindow_Label_Name, 0, 0, 1, 1)
self.MainWindow_Edit_Name = QtWidgets.QLineEdit(self.centralWidget)
self.MainWindow_Edit_Name.setEnabled(False)
self.MainWindow_Edit_Name.setObjectName("MainWindow_Edit_Name")
self.gridLayout.addWidget(self.MainWindow_Edit_Name, 0, 1, 1, 1)
self.gridLayout_3.addLayout(self.gridLayout, 0, 0, 1, 1)
self.gridLayout_2 = QtWidgets.QGridLayout()
self.gridLayout_2.setContentsMargins(11, 11, 11, 11)
self.gridLayout_2.setSpacing(6)
self.gridLayout_2.setObjectName("gridLayout_2")
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.gridLayout_2.addItem(spacerItem, 0, 3, 1, 1)
self.MainWindow_Button_AddName = QtWidgets.QPushButton(self.centralWidget)
self.MainWindow_Button_AddName.setObjectName("MainWindow_Button_AddName")
self.gridLayout_2.addWidget(self.MainWindow_Button_AddName, 0, 1, 1, 1)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.gridLayout_2.addItem(spacerItem1, 0, 0, 1, 1)
self.MainWindow_Button_Exit = QtWidgets.QPushButton(self.centralWidget)
self.MainWindow_Button_Exit.setObjectName("MainWindow_Button_Exit")
self.gridLayout_2.addWidget(self.MainWindow_Button_Exit, 0, 2, 1, 1)
self.gridLayout_3.addLayout(self.gridLayout_2, 1, 0, 1, 1)
MainWindow.setCentralWidget(self.centralWidget)
self.menuBar = QtWidgets.QMenuBar(MainWindow)
self.menuBar.setGeometry(QtCore.QRect(0, 0, 294, 21))
self.menuBar.setObjectName("menuBar")
MainWindow.setMenuBar(self.menuBar)
self.mainToolBar = QtWidgets.QToolBar(MainWindow)
self.mainToolBar.setObjectName("mainToolBar")
MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar)
self.statusBar = QtWidgets.QStatusBar(MainWindow)
self.statusBar.setObjectName("statusBar")
MainWindow.setStatusBar(self.statusBar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.MainWindow_Label_Name.setText(_translate("MainWindow", "Name:"))
self.MainWindow_Button_AddName.setText(_translate("MainWindow", "Add name"))
self.MainWindow_Button_Exit.setText(_translate("MainWindow", "Exit"))
addnamedialog.py (mit Qt Designer erstellt):
Code: Alles auswählen
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'addnamedialog.ui'
#
# Created by: PyQt5 UI code generator 5.8.1
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_AddNameDialog(object):
def setupUi(self, AddNameDialog):
AddNameDialog.setObjectName("AddNameDialog")
AddNameDialog.resize(230, 71)
self.gridLayout_3 = QtWidgets.QGridLayout(AddNameDialog)
self.gridLayout_3.setContentsMargins(11, 11, 11, 11)
self.gridLayout_3.setSpacing(6)
self.gridLayout_3.setObjectName("gridLayout_3")
self.gridLayout = QtWidgets.QGridLayout()
self.gridLayout.setContentsMargins(11, 11, 11, 11)
self.gridLayout.setSpacing(6)
self.gridLayout.setObjectName("gridLayout")
self.AddNameDialog_Label_Name = QtWidgets.QLabel(AddNameDialog)
self.AddNameDialog_Label_Name.setObjectName("AddNameDialog_Label_Name")
self.gridLayout.addWidget(self.AddNameDialog_Label_Name, 0, 0, 1, 1)
self.AddNameDialog_Edit_Name = QtWidgets.QLineEdit(AddNameDialog)
self.AddNameDialog_Edit_Name.setObjectName("AddNameDialog_Edit_Name")
self.gridLayout.addWidget(self.AddNameDialog_Edit_Name, 0, 1, 1, 1)
self.gridLayout_3.addLayout(self.gridLayout, 0, 0, 1, 1)
self.gridLayout_2 = QtWidgets.QGridLayout()
self.gridLayout_2.setContentsMargins(11, 11, 11, 11)
self.gridLayout_2.setSpacing(6)
self.gridLayout_2.setObjectName("gridLayout_2")
self.AddNameDialog_Button_Cancel = QtWidgets.QPushButton(AddNameDialog)
self.AddNameDialog_Button_Cancel.setObjectName("AddNameDialog_Button_Cancel")
self.gridLayout_2.addWidget(self.AddNameDialog_Button_Cancel, 0, 2, 1, 1)
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.gridLayout_2.addItem(spacerItem, 0, 0, 1, 1)
self.AddNameDialog_Button_Submit = QtWidgets.QPushButton(AddNameDialog)
self.AddNameDialog_Button_Submit.setObjectName("AddNameDialog_Button_Submit")
self.gridLayout_2.addWidget(self.AddNameDialog_Button_Submit, 0, 1, 1, 1)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.gridLayout_2.addItem(spacerItem1, 0, 3, 1, 1)
self.gridLayout_3.addLayout(self.gridLayout_2, 1, 0, 1, 1)
self.retranslateUi(AddNameDialog)
QtCore.QMetaObject.connectSlotsByName(AddNameDialog)
def retranslateUi(self, AddNameDialog):
_translate = QtCore.QCoreApplication.translate
AddNameDialog.setWindowTitle(_translate("AddNameDialog", "AddNameWindow"))
self.AddNameDialog_Label_Name.setText(_translate("AddNameDialog", "Name:"))
self.AddNameDialog_Button_Cancel.setText(_translate("AddNameDialog", "Cancel"))
self.AddNameDialog_Button_Submit.setText(_translate("AddNameDialog", "Submit"))
ui.py:
Code: Alles auswählen
from PyQt5 import QtWidgets
from mainwindow import Ui_MainWindow
from addnamedialog import Ui_AddNameDialog
import sys
class MainWindow(Ui_MainWindow, QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
# Create AddNameWindow
self.AddNameDialog = AddNameDialog()
# Connect buttons to functions
self.MainWindow_Button_AddName.clicked.connect(self.add_name)
self.MainWindow_Button_Exit.clicked.connect(self.exit_program)
# Create list of names
self.names = []
def add_name(self):
print(self.__class__.__name__ + ": Add name pressed.")
if self.AddNameDialog.exec_():
print(self.__class__.__name__ + ": Submit pressed in " +
self.AddNameDialog.__class__.__name__)
print("Text entered in " + self.AddNameDialog.__class__.__name__ + ": " +
self.AddNameDialog.AddNameDialog_Edit_Name.text())
self.names.append(self.AddNameDialog.AddNameDialog_Edit_Name.text())
self.fill_in_names()
else:
print(self.__class__.__name__ + ": Cancel pressed in " +
self.AddNameDialog.__class__.__name__)
self.AddNameDialog.AddNameDialog_Edit_Name.clear()
def fill_in_names(self):
name_str = ""
for name in self.names:
name_str += name + ", "
self.MainWindow_Edit_Name.setText(name_str)
def exit_program(self):
print(self.__class__.__name__ + ": Exit pressed.")
sys.exit(0)
class AddNameDialog(Ui_AddNameDialog, QtWidgets.QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.setupUi(self)
# Connect buttons to functions
self.AddNameDialog_Button_Submit.clicked.connect(self.submit)
self.AddNameDialog_Button_Cancel.clicked.connect(self.cancel)
def submit(self):
print(self.__class__.__name__ + ": Submit pressed.")
self.accept()
def cancel(self):
print(self.__class__.__name__ + ": Cancel pressed.")
self.reject()
main.py:
Code: Alles auswählen
from PyQt5.QtWidgets import *
from ui import *
import sys
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
Nun hab ich noch ein paar Fragen:
1. Ist die Art und Weise, wie ich oben alles umgesetzt hab, in Ordnung? Wenn ihr Vorschläge habt, wie man das Ganze besser umsetzen kann, oder wie man Teile anders schreiben könnte, damit sie eher einem pythonic-konformen Ansatz entsprechen, würde ich mich freuen, wenn ihr mir diese mitteilt!
2. Was ist der Unterschied zwischen "sys.exit(app.exec_())" und "app.exec_()"?
3. Wieso wird im Konstruktor von MainWindow "super().__init__(parent)" benötigt, wenn beim Erstellen kein parent übergeben wird?
4. Was passiert bei "self.setupUi(self)"?
5. Wenn ich in AddNameDialog in der Methode "cancel()" anstelle von "self.close()" den Befehl "self.cancel()" einfüge und im Programm im AddNameDialog-Fenster auf "Cancel" klicke, wird auf der Konsole haufenweise "AddNameDialog: Cancel pressed." ausgegeben und das Programm crashed. Was passiert da genau?
Vielen Dank schon mal für eure Hilfe!
Gruß,
logithack