Quellcode aus PyQt Designer

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

Hiho,

ne blöde frage: wie kann ich unter Windows, wenn ich im Designer eine Oberfläche gebaut habe. Diese in Quellcode umsetzen, sodass mir die Signal-Slot Sachen erhalten bleiben?
Wenn ich das per Kommandozeile und uic mache, bekomme ich nur die Anordnung der Elemente zurück:

Code: Alles auswählen

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'test.ui'
#
# Created: Thu Dec 02 15:14:57 2010
#      by: PyQt4 UI code generator 4.3.1
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(QtCore.QSize(QtCore.QRect(0,0,399,306).size()).expandedTo(MainWindow.minimumSizeHint()))

        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.lcdNumber = QtGui.QLCDNumber(self.centralwidget)
        self.lcdNumber.setGeometry(QtCore.QRect(130,90,201,101))
        self.lcdNumber.setObjectName("lcdNumber")

        self.horizontalSlider = QtGui.QSlider(self.centralwidget)
        self.horizontalSlider.setGeometry(QtCore.QRect(150,220,160,21))
        self.horizontalSlider.setOrientation(QtCore.Qt.Horizontal)
        self.horizontalSlider.setObjectName("horizontalSlider")
        MainWindow.setCentralWidget(self.centralwidget)

        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0,0,399,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.QObject.connect(self.horizontalSlider,QtCore.SIGNAL("valueChanged(int)"),self.lcdNumber.display)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

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

EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

Ich verstehe deine Frage nicht ganz. In der Datei, die du mit uic generierst steht doch

Code: Alles auswählen

QtCore.QObject.connect(self.horizontalSlider,QtCore.SIGNAL("valueChanged(int)"),self.lcdNumber.display)
Welche Connects vermisst du denn?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Zudem sei noch mal darauf verwiesen, dass man besser auf das Generieren verzichten sollte und stattdessen mittels des uic-Moduls die GUI-Spezifikationsdatei zur Laufzeit laden und daraus die GUI dynamisch generieren sollte.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
solar22
User
Beiträge: 27
Registriert: Donnerstag 14. Oktober 2010, 20:31

Es würde mich interessieren, wie das geht.
Das such ich schon die ganze Zeit :K

Gruß!
solar22
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Die Funktion heißt loadUI

http://www.riverbankcomputing.co.uk/sta ... uic-module

Code: Alles auswählen

from PyQt4 import QtCore, QtGui, uic


class MainWindow(QtGui.QMainWindow):

    def __init__(self, *args):
        QtGui.QWidget.__init__(self, *args)
        uic.loadUi("deinegui.ui", self)
So in etwa
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
solar22
User
Beiträge: 27
Registriert: Donnerstag 14. Oktober 2010, 20:31

Mh ja er lädt was, aber wenn ich meine hauptdialog.ui mit dem QtCreator 4 Designer ändere und speichere und mein Programm neu starte werden die Änderungen nicht übernommen :(

Edit: Hier der Startcode:

Code: Alles auswählen

class MeinDialog(QtGui.QMainWindow): 
    	def __init__(self): 
        	QtGui.QDialog.__init__(self) 
		loadUi("/var/www/cachebase/UI/hauptdialog.ui", self)
lunar

"/var/www/cachebase/UI/hauptdialog.ui"?! Was in Gottes Namen treibst Du denn da? Du entwickelst doch nicht etwa in systemweiten Verzeichnissen?

Jedenfalls machst Du irgendetwas falsch, wenn die Änderungen an der Oberfläche nach der Bearbeitung der UI-Datei nicht in der Anwendung angezeigt werden. Was genau, das lässt sich ohne genauere Informationen nicht sagen.
solar22
User
Beiträge: 27
Registriert: Donnerstag 14. Oktober 2010, 20:31

Ich hab den Pfad erstmal hard gecodet ja (das ich in /var/www/ arbeite liegt daran, das dies immer mein Projektverzeichnis zum Programmieren ist).
Ich weis, wie ich den Pfad später auslese, wollte das nur grad direkt angeben das er nicht eine andere Datei nimmt aus versehen um den Fehler einzukreisen.

Welche Informationen benötigst du denn genau?
lunar

@solar22: Wie wäre es mit dem Pfad der Datei, die Du im Programm lädst und dem Pfad der Datei, die Du im Designer bearbeitest? Die sind offenbar verschieden.

"/var/www/" als Projektverzeichnis zu verwenden, ist – gelinde gesagt – sehr ungewöhnlich. "/var/www/" ist normalerweise ein Systemverzeichnis, in dem statische Dateien für den Webserver abgelegt sind, und dementsprechend für den Benutzer nicht einmal beschreibbar. Du entwickelst doch hoffentlich nicht als "root"?

Üblicherweise programmiert man in seinem eigenen Heimatverzeichnis (e.g. "/home/solar22/"), genau so wie man alle eigenen Daten, Dateien, usw. in diesem Verzeichnis aufbewahrt.
solar22
User
Beiträge: 27
Registriert: Donnerstag 14. Oktober 2010, 20:31

Der Pfad der Datei im Designer ist der selbe. Ich haben eben nochmal die Datei überschrieben, keine Änderung.

/var/www/ hab ich in meine Benutzergruppe geholt das Berechtigungen angeht.
Normalerweise entwickel ich mit PHP und Co, daher hab ich mir das angewöhnt dort zu entwickeln, damit ich die Datein in meinem Wirrwarr von /home-Ordner nicht verliere.

Nein, ich entwickel nicht als root :) Das wäre ja lebensmüde.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

1. Dein "Dialog" ist ein QMainWindow.
2. Du initialisierst ein QMainWindow mit dem Code fuer einen QDialog.
Wundert mich, dass das noch nicht kracht. Und dann noch:
http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/pyqt4ref.html#the-uic-module hat geschrieben:loadUi(uifile, baseinstance=None)

This function loads a Qt Designer .ui file and returns an instance of the user interface.

uifile is a file name or file-like object containing the .ui file.

baseinstance is an optional instance of the Qt base class. If specified then the user interface is created in it. Otherwise a new instance of the base class is automatically created.
solar22
User
Beiträge: 27
Registriert: Donnerstag 14. Oktober 2010, 20:31

Wenn ich das in

Code: Alles auswählen

class MeinDialog(QtGui.QMainWindow): 
    	def __init__(self): 
        	QtGui.QMainWindow.__init__(self) 
		loadUi("/var/www/cachebase/UI/hauptdialog.ui", self)
ändert sich aber auch nix ^^
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Das war ein Schritt in die Falsche Richtung. Vorrausgesetzt in `hauptdialog.ui` steckt ein Dialog-Widget.
solar22
User
Beiträge: 27
Registriert: Donnerstag 14. Oktober 2010, 20:31

In der hauptdialog.ui steht:

Code: Alles auswählen

ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
Denmnach nehme ich an das es sich um ein QMainWindow handelt, oder ?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ja, dann ist es ein QMainWindow. Das heisst aber auch, dass du dich mal um deine irrefuehrenden Namen kuemmern solltest.

Wir haben jetzt lange genug im Trueben gefischt: Wir brauchen den relevanten Code und die ui Datei.
solar22
User
Beiträge: 27
Registriert: Donnerstag 14. Oktober 2010, 20:31

Ich fragte ja schon, was für Infos ihr braucht :) Ich denke ja nicht, das ihr 400Zeilen Code haben wollt.
Aber hier erstmal die .ui Datei:
http://nopaste.info/c58249091a_nl.html
Den Klassennamen hab ich mal angepasst :) War wirklich ziemlich irreführend, stimmt.

Der Aufruf als solcher ist ganz normal:

Code: Alles auswählen

app = QtGui.QApplication(sys.argv)        
dialog = Cachebase() 
dialog.tableWidget.resizeColumnsToContents()
dialog.show()
sys.exit(app.exec_())
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Mit folgendem Code habe ich kein Problem:

Code: Alles auswählen

from PyQt4 import QtGui, QtCore, uic
import sys


class Main(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(Main, self).__init__(parent)
        uic.loadUi("test.ui", self)

app = QtGui.QApplication(sys.argv)
main = Main()
main.show()
sys.exit(app.exec_())
Fuers naechste mal bitte bei einer pastebin, die einem das herunterladen der Datei ermoeglicht, z.b paste.pocoo.org
solar22
User
Beiträge: 27
Registriert: Donnerstag 14. Oktober 2010, 20:31

Mhh....dein Code funktioniert.
Es scheint wohl nur die Änderung der Zeile

Code: Alles auswählen

QtGui.QMainWindow.__init__(self) 
in

Code: Alles auswählen

super(Main, self).__init__(parent)
gewesen zu sein.

Danke dir :)
Alles klar, das nächste mal paste.pocoo.org ;)
Antworten