Nun hoffe ich, dass ich diesmal eine vermeintliche Lösung gefunden habe. Was habe ich getan? Ich bin von QMdiArea auf QWorkspace "umgestiegen" bzw. QWorkspace dem Widget QMdiArea vorgezogen. Im Gegensatz zu QmdiArea musste ich nicht jeden Scrollbar (Horizontal und Vertikal) einzeln hinzufügen. Bei QWorkspace setzt man die ScrollBars einfach auf True und fertig. Ansonsten habe ich dieses Widget genauso wie QMdiAre in die Klasse 'MDIFormular' hinzugefügt. Hier der Code:
MDIForm.py
Code: Alles auswählen
import sys
from PyQt4.QtGui import QMainWindow, QApplication, QAction, QMenuBar, QToolBar, QIcon, QMdiArea, QScrollBar, QMdiSubWindow, QMessageBox, QWorkspace
from PyQt4.QtCore import SIGNAL, SLOT, Qt
class MDIFormular(QMainWindow):
def __init__ (self, parent=None):
QMainWindow.__init__(self, parent)
[...]
self.workspace = QWorkspace()
self.workspace.setScrollBarsEnabled(True)
self.setCentralWidget(self.workspace)
[...]
def CreateNewMovie(self, event): # Neues Fenster für Film hinzufügen öffnen
Fenster = MyForm(self)
if self.existUnterfenster(self.Dict_Language.Dict_TestDialog["Title"]):
reply = QMessageBox.question(self, (self.Dict_Language.Dict_Message_WindowExists["MessageTitle"]),
self.Dict_Language.Dict_Message_WindowExists["MessageText"], QMessageBox.Ok)
print "MessageBox wurde ausgegeben."
else:
self.workspace.addWindow(Fenster)
Fenster.show()
print "Dialog lädt"
def existUnterfenster(self, Title):
for window in self.workspace.windowList():
if Title == window.windowTitle():
return True
print "Fenster bereits geladen"
TestDialog.py
Code: Alles auswählen
# -*- coding: utf-8 -*-
import sys
from PyQt4.QtGui import QWidget, QApplication, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QMessageBox, QTextEdit, QMdiSubWindow, QDialog, QMdiArea
from PyQt4.QtCore import Qt
class MyForm(QWidget):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.setAttribute(Qt.WA_DeleteOnClose)
#Layout festlegen
self.setLayout(QVBoxLayout())
#Eingabe Widget mit Text erstellen
pHBox = QHBoxLayout()
self.LLabel = QLabel(self.Chosen_Language.Dict_TestDialog["Label1"])
self.LEMsg = QLineEdit()
#Ins Layout packen und Layout ins Widget packen
pHBox.addWidget(self.LLabel)
pHBox.addWidget(self.LEMsg)
self.layout().addLayout(pHBox)
#2 Buttons hinzufuegen
pHBox = QHBoxLayout()
self.BShow = QPushButton(self.Chosen_Language.Dict_TestDialog["cmd_Ok"])
self.BClose = QPushButton(self.Chosen_Language.Dict_TestDialog["cmd_Beenden"])
#Ins Layout packen
pHBox.addWidget(self.BShow)
pHBox.addWidget(self.BClose)
self.layout().addLayout(pHBox)
#Zeigen−Button bei Klick showMessage aufrufen lassen, Signal und Slot
#verbinden
self.BShow.clicked.connect(self.showMessage)
#Beim Klick auf Beenden−Button schliessen, Signal und Slot verbinden
self.BClose.clicked.connect(self.CloseMe)
def CloseMe(self):
print "Fenster wird geschlossen.."
self.close()
# In einer MesssageBox nochmal nachfragen, ob das Programm wirklich geschlossen
# werden soll.
def closeEvent(self, event):
reply = QMessageBox.question(self, (self.Chosen_Language.Dict_Message["MessageTitle"]),
self.Chosen_Language.Dict_Message["MessageText"], QMessageBox.Yes, QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
myapp = MyForm()
myapp.show()
sys.exit(app.exec_())
Also, das Fenster wird wunderbar geschlossen. Für diejenigen, die es gerne mal probieren wollen, stelle ich mein kleines Projekt gerne online zum Herunterladen zur Verfügung:
Herunterladen.
Wenn ihr noch Kritik oder Anmerkungen habt, dann immer her damit. Aber ich habe noch eine Frage an euch. Augenscheinlich konnte ich keinen Unterschied zwischen den beiden Widgets QWorkspace und QMdiArea feststellen - abgesehen von den Namen. Ist QWorkspace "älter" als QMdiArea? Und wie man im Modul "TestDialog.py" sehr deutlich sehen kann, war es mir möglich durch einfache 'close()'-Methode das Fenster zu schließen. QMdiArea scheint da wesentlich mächtiger zu sein, und gibt sich wohl nicht einfach so mit 'close()' zufrieden.