setCentralWidget problem

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
sevelen
User
Beiträge: 33
Registriert: Dienstag 4. August 2009, 07:34

Guten morgen zusammen,

ich habe folgendes Problem. Ich erzeuge im QT Designer eine ganz einfache GUI mit einem Button in einem layout.
Jetzt gehe ich hin und übersetze die UI datei in eine Py. Beim starten allerdings bekomme ich sofort eine Fehlermeldung welche ich mir nicht erklären kann, im designer funktioniert das alles noch prima in der vorschau.

Code: Alles auswählen

AttributeError: setCentralWidget
File "c:\testdll\DLLTest\QTDlg.py", line 77, in <module>
  dialog = MeinDialog()
File "c:\testdll\DLLTest\QTDlg.py", line 51, in __init__
  self.setupUi(self)
File "c:\testdll\DLLTest\hauptdialog.py", line 23, in setupUi
  MainWindow.setCentralWidget(self.centralwidget)

GUI

Code: Alles auswählen

from PyQt4 import QtCore, QtGui

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtGui.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.pushButton = QtGui.QPushButton(self.centralwidget)
        self.pushButton.setObjectName("pushButton")
        self.verticalLayout.addWidget(self.pushButton)

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setText(QtGui.QApplication.translate("MainWindow", "PushButton", None, QtGui.QApplication.UnicodeUTF8))

Aufruf

Code: Alles auswählen

class MeinDialog(QtGui.QDialog, Dlg): 
    def __init__(self): 
        QtGui.QDialog.__init__(self) 
        self.setupUi(self)
 ...
       
 
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

Hi,

Das Problem ist, dass du im Designer ein "QMainWindow" erstellst, aber dann dein MeinDialog von QDialog erben lässt. Und QDialog kennt kein "setCentralWidget()", das ist QMainWindow-unique.

Also entweder im Designer eine "Dialog"-ui erstellen, oder deinen Dialog in ein MainWindow umbauen, sprich von QtGui.QMainWindow erben lassen.

Grüße
Franz
sevelen
User
Beiträge: 33
Registriert: Dienstag 4. August 2009, 07:34

Danke schön das hat wunderbar geklappt hätte ich auch selber drauf kommen können :-)

Aber villeicht kannst du mir auch noch bei einer anderen sache einen rat geben. Ich habe eben noch gesehen das es die Möglichkeit gibt die UI datei dynamisch einzuladen ohne sie vorher zu übersetzen.

Code: Alles auswählen

uic.loadUi("c:\\Hauptdialog.ui", self) 
Wenn ich das allerdings einbaue anstatt "self.setupUi(self)" bekomme ich sofort haufenweise fehler.

Code: Alles auswählen

NameError: global name 'LiteralProxyClass' is not defined
File "C:\testdir\Main.py", line 12, in <module>
  from PyQt4 import QtGui, uic
File "C:\Python25\Lib\site-packages\PyQt4\uic\__init__.py", line 7, in <module>
  from Compiler import indenter, compiler
File "C:\Python25\Lib\site-packages\PyQt4\uic\Compiler\compiler.py", line 4, in <module>
  from qobjectcreator import CompilerCreatorPolicy
File "C:\Python25\Lib\site-packages\PyQt4\uic\Compiler\qobjectcreator.py", line 4, in <module>
  from qtproxies import QtGui, Literal, strict_getattr
File "C:\Python25\Lib\site-packages\PyQt4\uic\Compiler\qtproxies.py", line 146, in <module>
  class ProxyClass(object):
File "C:\Python25\Lib\site-packages\PyQt4\uic\Compiler\qtproxies.py", line 127, in __init__
  if not hasattr(args[0], "module"):
File "C:\Python25\Lib\site-packages\PyQt4\uic\Compiler\qtproxies.py", line 134, in __getattribute__
  return type(name, (LiteralProxyClass,),
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

Kannst du dazu vllt. etwas mehr Code posten? Ich hab hiermit nämlich keine Prbleme:

Code: Alles auswählen

import PyQt4.QtGui as qg
import PyQt4.QtCore as qc
from PyQt4 import uic
import sys

class Window(qg.QWidget):
    def __init__(self, parent=None):
        qg.QWidget.__init__(self)
        uic.loadUi("./test2.ui", self)

if __name__ == "__main__":
    app = qg.QApplication(sys.argv)
    win = Window()
    win.show()
    app.exec_()
sevelen
User
Beiträge: 33
Registriert: Dienstag 4. August 2009, 07:34

ok das ist interessant ich habe genau deinen code in eine leere datei gepackt. Ausschließlich die UI datei geändert. Und sofort bekomm ich wieder den Fehler.

Code: Alles auswählen

NameError: global name 'LiteralProxyClass' is not defined
File "C:\testdir\test.py", line 3, in <module>
  from PyQt4 import uic
File "C:\Python25\Lib\site-packages\PyQt4\uic\__init__.py", line 7, in <module>
  from Compiler import indenter, compiler
File "C:\Python25\Lib\site-packages\PyQt4\uic\Compiler\compiler.py", line 4, in <module>
  from qobjectcreator import CompilerCreatorPolicy
File "C:\Python25\Lib\site-packages\PyQt4\uic\Compiler\qobjectcreator.py", line 4, in <module>
  from qtproxies import QtGui, Literal, strict_getattr
File "C:\Python25\Lib\site-packages\PyQt4\uic\Compiler\qtproxies.py", line 146, in <module>
  class ProxyClass(object):
File "C:\Python25\Lib\site-packages\PyQt4\uic\Compiler\qtproxies.py", line 127, in __init__
  if not hasattr(args[0], "module"):
File "C:\Python25\Lib\site-packages\PyQt4\uic\Compiler\qtproxies.py", line 134, in __getattribute__
  return type(name, (LiteralProxyClass,),
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nunja der Traceback zeigt ja, dass der Fehler im uic Modul liegt und nicht bei anderem Code. Du solltest mal eine neuere PyQt-Version testen.
franzf
User
Beiträge: 78
Registriert: Samstag 29. August 2009, 10:21

Ok, komisch...
Welche PyQt4-Version hast du installiert? Wie hast du installiert? Direkt das binary von riverbankcomputing.com, oder alles selber kompiliert?
Es schaut nämlich irgendwie nach nem Problem in qtproxies.py aus. Bei mir gibt es die return-Anweisung gar nicht mehr in qtproxies.py, die liegt hier in proxy_type.py!
Bei mir ist installiert
- PyQt4-4.5.4
- Qt-4.5.2
alles mit nem GCC-4.4.1
sevelen
User
Beiträge: 33
Registriert: Dienstag 4. August 2009, 07:34

Also ich arbeite mit Python 2.5 und ner PyQT version von 4.4.3.

Ich hatte das ganze packet mittels Python XY installiert. War quasi alles dabei.

Da ich neu in Python bin war es der einfachste weg für mich zu starten...

War das falsch?
Antworten