Widgets werden nicht angezeigt

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Friedericus
User
Beiträge: 25
Registriert: Dienstag 21. September 2010, 14:59

Servus,

Eine frage: Warum werden weder das TextEdit, noch das Label angezeigt wenn ich das Programm ausführ?

Code: Alles auswählen

from PyQt4 import QtGui, QtCore
import sys


class ServerGui(QtGui.QMainWindow):             #Main Window erstellen
    def __init__(self):
        
        QtGui.QMainWindow.__init__(self)
        
        self.setGeometry(200, 200, 500, 700)
        self.setWindowTitle('Server')
        self.createWidgets()
        
              
         
        start = QtGui.QPushButton('OK', self)
        start.setGeometry(405, 660, 80, 25)
        
        quit = QtGui.QPushButton('Beenden', self)
        quit.setGeometry(315, 660, 80, 25)
         
        label = QtGui.QLabel('Hier soll')
        label.setGeometry(100, 100, 100, 100)
        label.show()
        
        edit = QtGui.QLineEdit()
        edit.setGeometry(100, 100, 100, 100)

        
        
 
    def createWidgets(self):
        central_widget = QtGui.QWidget()
        self.setCentralWidget(central_widget)

app = QtGui.QApplication(sys.argv)
gui = ServerGui()
gui.show()
sys.exit(app.exec_())
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

Kleiner Tipp: Woher soll dein Programm denn wissen, auf welchem Fenster das QLabel und QLineEdit liegen sollen?

Vergleiche mal die beiden Konstruktor-Aufrufe, beim ersten hast du es richtig gemacht.

Code: Alles auswählen

        quit = QtGui.QPushButton('Beenden', self)
        .... 
        label = QtGui.QLabel('Hier soll')
Ganz nebenbei, warum benutzt du nicht den Qt-Designer, da hälst du dich mit solchen Fehlern nicht unnötigerweise auf, zumal es glaube ich auch in den meisten Fällen nicht wirklich sinnvoll ist, feste Größen vorzugeben.

Wenn du es trotzdem per Hand machen willst, solltest du Layouts verwenden, wie z.B. hier erklärt:
http://zetcode.com/tutorials/pyqt4/germ ... anagement/
lunar

"label" und "edit" sind nur lokale Namen und haben kein Vater-Objekt, folglich existieren die Objekte nach dem Ende von ".__init__()" gar nicht mehr, da es keine weiteren Referenzen gibt, und der GC sie somit löscht.
Friedericus
User
Beiträge: 25
Registriert: Dienstag 21. September 2010, 14:59

So, ich hab das jetzt mal ein wenig umgebaut:

Code: Alles auswählen

from PyQt4 import QtGui, QtCore
import sys


class ServerGui(QtGui.QWidget):             #Main Window erstellen
    def __init__(self, parent = None):
        QtGui.QMainWindow.__init__(self, parent)
        
        grid = QtGui.QGridLayout()

        okButton = QtGui.QPushButton("OK")
        cancelButton = QtGui.QPushButton("Cancel")
        
        
        grid.addWidget(okButton, 0, 2)
        grid.addWidget(cancelButton, 0, 1)

       
        self.setLayout(grid)
        self.setWindowTitle('Server')
        self.resize(500, 700)

app = QtGui.QApplication(sys.argv)
ex = ServerGui()
ex.show()
sys.exit(app.exec_())
        
aber das Problem bleibt weiterhin: Wenn ich die Klasse als Main-Window Angebe erscheinen keine Buttons. Wenn ich es jedoch als Widget deklariere, werden mir die Buttons angezeigt.
lunar

"QMainWindow" hat bereits ein eigenes Layout, indem die Menüleisten, Statuszeilen und andere Dinge zu verwalten. Man kann dem "QMainWindow" daher nicht einfach ein neues Layout verpassen, sondern benötigt zwingend ein eigenes, unabhängiges "zentrales Widget" ("central widget"). Du musst also ein neues "QWidget" erzeugen, mit dem gewünschten Layout und den benötigten Steuerelementen versehen und anschließend mit "QMainWindow.setCentralWidget()" dem "QMainWindow" zuweisen. Daher auch die Warnung, die Du erhältst, wenn Du im gezeigten Quelltext "QMainWindow" anstelle von "QWidget" als Basisklasse nutzt.

Das alles steht im Übrigen auch direkt im ersten Absatz der Dokumentation zu "QMainWindow", die Du offensichtlich nicht gelesen hast. Sieh es als verspätetes Weihnachtsgeschenk, dass ich Dir diese Dokumentation so freundlich vorgelesen habe. Zu anderen Zeiten im Jahr wäre wohl nicht mehr als ein trockener Hinweis auf dieselbe drin gewesen, also lies doch in Zukunft bitte die Dokumentation, bevor Du fragst.

Zudem ist es ratsam, jedem "QWidget", oder noch allgemeiner jedem länglebigen "QObject" ein sinnvolles Vater-Objekt zuzuweisen, um Qt die Verwaltung des Speichers zu ermöglichen. Das aber würde in dieser Diskussion bereits gesagt.
Friedericus
User
Beiträge: 25
Registriert: Dienstag 21. September 2010, 14:59

ok, jetzt hab ich mir das mal durchgelesen, hab aber schon das nächste Problem:

warum wird mir der RadioButton angezeigt, das Label oder der Button aber nicht?

Code: Alles auswählen

from PyQt4 import QtGui, QtCore
import sys


class ServerGui(QtGui.QMainWindow):             #Main Window erstellen
    def __init__(self, parent = None):
        QtGui.QMainWindow.__init__(self, parent)
        
        central_widget = QtGui.QWidget()
        self.setCentralWidget(central_widget)

        
        grid = QtGui.QGridLayout()
        self.menubar()

        okButton = QtGui.QPushButton("OK")
        cancelButton = QtGui.QPushButton("Cancel")
        
        dateiAnzeigen = QtGui.QLabel('hallo du da')
        
        group1 = QtGui.QGroupBox('Datei Einlesen')        
        showData = QtGui.QVBoxLayout()
        
        radio1 = QtGui.QRadioButton('RadioButton')
        
        showData.addWidget(radio1)
        showData.addWidget(dateiAnzeigen)
        showData.addWidget(okButton)
        
        group1.setLayout(showData)
        
        
        grid.addWidget(okButton, 1, 2)
        grid.addWidget(cancelButton, 1, 1)
        grid.addWidget(group1, 0, 0)
        grid.addWidget(dateiAnzeigen, 0, 1)

       
        central_widget.setLayout(grid)
        self.setWindowTitle('Server')

app = QtGui.QApplication(sys.argv)
ex = ServerGui()
ex.show()
sys.exit(app.exec_())
 
So wie ich das hier:
http://doc.qt.nokia.com/latest/widgets-groupbox.html
drinsteht,(ganz unten) müsste das mit den Buttons zumindest eigentlich gehen.
lunar

Zeige den Quelltext, denn Du tatsächlich ausführst, nicht das, was Du für dieses Forum zusammen getippt hast. Bei diesem Quelltext tritt ein "AttributeError" auf, noch bevor die Oberfläche überhaupt angezeigt werden muss.

Und dann verweise ich nochmal auf den letzten Absatz meines vorherigen Beitrags.
Friedericus
User
Beiträge: 25
Registriert: Dienstag 21. September 2010, 14:59

jupp, da hast du recht, da hab ich das 'menubar übersehen.

also nochmal:

Code: Alles auswählen


from PyQt4 import QtGui, QtCore
import sys


class ServerGui(QtGui.QMainWindow):             #Main Window erstellen
    def __init__(self, parent = None):
        QtGui.QMainWindow.__init__(self, parent)
        
        central_widget = QtGui.QWidget()
        self.setCentralWidget(central_widget)

        
        grid = QtGui.QGridLayout()
        self.menubar()

        okButton = QtGui.QPushButton("OK")
        cancelButton = QtGui.QPushButton("Cancel")
        
        dateiAnzeigen = QtGui.QLabel('hallo du da')
        
        group1 = QtGui.QGroupBox('Datei Einlesen')        
        showData = QtGui.QVBoxLayout()
        
        radio1 = QtGui.QRadioButton('RadioButton')
        
        showData.addWidget(radio1)
        showData.addWidget(dateiAnzeigen)
        showData.addWidget(okButton)
        
        group1.setLayout(showData)
        
        
        grid.addWidget(okButton, 1, 2)
        grid.addWidget(cancelButton, 1, 1)
        grid.addWidget(group1, 0, 0)
        grid.addWidget(dateiAnzeigen, 0, 1)

       
        central_widget.setLayout(grid)
        self.setWindowTitle('Server')
        #self.resize(500, 700)
        
    
    
    def createWidgets(self):
        central_widget = QtGui.QWidget()
        widget = self.setCentralWidget(central_widget)
        return widget
    

    def menubar(self):                          #Funktion fuer die Menueleiste
        
        exit = QtGui.QAction(QtGui.QIcon('icons/exit.png'), 'Exit', self)       #Fuegt den Exit-Button in der Menueleiste hinzu
        exit.setShortcut('Ctrl+Q')
        self.connect(exit, QtCore.SIGNAL('triggered()'), QtCore.SLOT('close()'))
        
        open = QtGui.QAction(QtGui.QIcon('open.png'), 'Open', self)             #Fuegt den 'OpenFile' Button der Menueleiste hinzu      
        open.setShortcut('Ctrl+O')
        open.setStatusTip('Open new File')
        self.connect(open, QtCore.SIGNAL('triggered()'), self.openFile)
        
        menubar = self.menuBar()
        file = menubar.addMenu('&Datei')
        file.addAction(exit)
        file.addAction(open)
        
    def openFile(self):
        filename = QtGui.QFileDialog.getOpenFileName(self, 'Open file',
                    '/home')
        file = open(filename)
        data = file.read()
        self.textEdit.setText(data)
        
    def choosenFile(self, file):
        pass

app = QtGui.QApplication(sys.argv)
ex = ServerGui()
ex.show()
sys.exit(app.exec_())
Zuletzt geändert von Friedericus am Dienstag 28. Dezember 2010, 09:08, insgesamt 1-mal geändert.
lunar

Mit diesem Quelltext kann ich den Fehler nicht reproduzieren.
Friedericus
User
Beiträge: 25
Registriert: Dienstag 21. September 2010, 14:59

hmm, bei mir gehts. RadioButton wird in der Group Box angezeigt, der Button und das Label jedoch nicht, obwohl sie gleich implementiert sind.
Antworten