Seite 1 von 1

Widgets werden nicht angezeigt

Verfasst: Donnerstag 23. Dezember 2010, 14:47
von Friedericus
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_())

Re: Widgets werden nicht angezeigt

Verfasst: Freitag 24. Dezember 2010, 11:12
von EmaNymton
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/

Re: Widgets werden nicht angezeigt

Verfasst: Freitag 24. Dezember 2010, 13:07
von 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.

Re: Widgets werden nicht angezeigt

Verfasst: Montag 27. Dezember 2010, 15:06
von Friedericus
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.

Re: Widgets werden nicht angezeigt

Verfasst: Montag 27. Dezember 2010, 15:28
von 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.

Re: Widgets werden nicht angezeigt

Verfasst: Montag 27. Dezember 2010, 17:06
von Friedericus
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.

Re: Widgets werden nicht angezeigt

Verfasst: Montag 27. Dezember 2010, 17:12
von 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.

Re: Widgets werden nicht angezeigt

Verfasst: Montag 27. Dezember 2010, 17:31
von Friedericus
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_())

Re: Widgets werden nicht angezeigt

Verfasst: Montag 27. Dezember 2010, 17:48
von lunar
Mit diesem Quelltext kann ich den Fehler nicht reproduzieren.

Re: Widgets werden nicht angezeigt

Verfasst: Dienstag 28. Dezember 2010, 09:11
von Friedericus
hmm, bei mir gehts. RadioButton wird in der Group Box angezeigt, der Button und das Label jedoch nicht, obwohl sie gleich implementiert sind.