Seite 1 von 1

setCentralWidget problem

Verfasst: Dienstag 1. September 2009, 07:25
von sevelen
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)
 ...
       
 

Verfasst: Dienstag 1. September 2009, 09:41
von franzf
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

Verfasst: Dienstag 1. September 2009, 10:19
von sevelen
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,),

Verfasst: Dienstag 1. September 2009, 10:38
von franzf
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_()

Verfasst: Dienstag 1. September 2009, 10:54
von sevelen
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,),

Verfasst: Dienstag 1. September 2009, 11:24
von cofi
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.

Verfasst: Dienstag 1. September 2009, 11:26
von franzf
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

Verfasst: Dienstag 1. September 2009, 11:56
von sevelen
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?