PyQt4: WindowTitle ändern / Label-Text init. ... aber wie?

Hallo,
wenn ich
1.) in einem Dialog zum Programmstart den Text eines Labels ändern will, klappt das nicht so, wie gedacht. Es geht nur, wenn ich das innerhalb der setupUi mache.
2.) ich den WindowTitle z. B. als Reaktion auf einen Klick auf einen Button ändern möchte, wird der Titel nicht geändert.
Bei PyQt3 klappte das alles immer... ich schätze, es hat sich was am Konzept mit der Version 4 geändert. Nun suche ich schon wochenlang in der Doku und google fleissig rum, werde aber nicht fündig. Kann jemand helfen?
Gruß Daniel
Dateien des NICHT funktionierenden Programms:
------------------------------------------------------------------------------------------------------------------------ main.py:
#!/usr/bin/env python # -*- coding: utf-8 -*-
import sys from PyQt4 import QtCore, QtGui
from mainform_impl import Mainform_Impl
# create Qt application app = QtGui.QApplication(sys.argv) QtCore.QObject.connect(app,QtCore.SIGNAL("lastWindowClosed()"),app,QtCore.SLOT("quit()"))
# create and show Qt form MainWindow = QtGui.QMainWindow() ui = Mainform_Impl() ui.setupUi(MainWindow) MainWindow.show()
# enter Qt event-handling loop sys.exit(app.exec_())
------------------------------------------------------------------------------------------------------------------------ Ui_test01.py:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/daniel/Develop/PyDevel/projects/PyQt4Test/test01.ui' # # Created: Sun Nov 4 18:21:05 2007 # 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_Dialog(object):
def setupUi(self, Dialog): Dialog.setObjectName("Dialog")
Dialog.resize(QtCore.QSize(QtCore.QRect(0,0,400,300).size()).expandedTo(Dialog.minimumSizeHint()))
self.pushButton = QtGui.QPushButton(Dialog) self.pushButton.setGeometry(QtCore.QRect(200,250,76,28)) self.pushButton.setObjectName("pushButton")
self.label = QtGui.QLabel(Dialog) self.label.setGeometry(QtCore.QRect(40,30,271,61)) self.label.setObjectName("label")
self.retranslateUi(Dialog)
QtCore.QObject.connect(self.pushButton,QtCore.SIGNAL("clicked()"),self.on_pushButton_clicked) QtCore.QMetaObject.connectSlotsByName(Dialog)
def on_pushButton_clicked(self): """ Slot documentation goes here. """ # TODO: not implemented yet raise "Not implemented yet"
def retranslateUi(self, Dialog): Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8)) self.pushButton.setText(QtGui.QApplication.translate("Dialog", "DO IT !", None, QtGui.QApplication.UnicodeUTF8)) self.label.setText(QtGui.QApplication.translate("Dialog", "TextLabel", None, QtGui.QApplication.UnicodeUTF8))
if __name__ == "__main__": import sys app = QtGui.QApplication(sys.argv) Dialog = QtGui.QDialog() ui = Ui_Dialog() ui.setupUi(Dialog) Dialog.show() sys.exit(app.exec_())
------------------------------------------------------------------------------------------------------------------------ mainform_impl.py:
# -*- coding: utf-8 -*-
""" Module implementing Mainform_Impl. """
from PyQt4.QtGui import QDialog from PyQt4.QtCore import pyqtSignature
from Ui_test01 import Ui_Dialog
class Mainform_Impl(QDialog, Ui_Dialog): """ Class documentation goes here. """ def __init__(self, parent = None): """ Constructor """ QDialog.__init__(self, parent) self.setupUi(self) self.label.setText("HALLO WELT") # <- DAS FÜHRT ZU KEINEM EFFEKT! WARUM BLOSS???
@pyqtSignature("") def on_pushButton_clicked(self): """ Slot documentation goes here. """ # TODO: not implemented yet self.label.setText("HALLO") self.setWindowTitle("JAWOLL") # <- UND DAS FÜHRT AUCH NICHT ZU EINER ÄNDERUNG DES TITELS... WIE ERREICHE ICH DAS???

-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
Daniel Hagemeister-Biernath wrote:
Hallo,
wenn ich
1.) in einem Dialog zum Programmstart den Text eines Labels ändern will, klappt das nicht so, wie gedacht. Es geht nur, wenn ich das innerhalb der setupUi mache.
2.) ich den WindowTitle z. B. als Reaktion auf einen Klick auf einen Button ändern möchte, wird der Titel nicht geändert.
Du suchst glaub ich an der falschen Ecke. Änderungen waren nur in Ui_test01.py nötig.
[...]
Ui_test01.py:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '/home/daniel/Develop/PyDevel/projects/PyQt4Test/test01.ui' # # Created: Sun Nov 4 18:21:05 2007 # 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_Dialog(object):
def setupUi(self, Dialog): Dialog.setObjectName("Dialog")
Dialog.resize(QtCore.QSize(QtCore.QRect(0,0,400,300).size()).expandedTo(Dialog.minimumSizeHint()))
self.pushButton = QtGui.QPushButton(Dialog) self.pushButton.setGeometry(QtCore.QRect(200,250,76,28)) self.pushButton.setObjectName("pushButton") self.label = QtGui.QLabel(Dialog) self.label.setGeometry(QtCore.QRect(40,30,271,61)) self.label.setObjectName("label") self.retranslateUi(Dialog)
self.mainwindow = Dialog
QtCore.QObject.connect(self.pushButton,QtCore.SIGNAL("clicked()"),self.on_pushButton_clicked) QtCore.QMetaObject.connectSlotsByName(Dialog)
def on_pushButton_clicked(self): """ Slot documentation goes here. """ # TODO: not implemented yet
self.mainwindow.setWindowTitle("TestApp v0.0.1") return
raise "Not implemented yet"
[...]
HTH
- -- Gerhard

On 05.11.07 21:29:11, Daniel Hagemeister-Biernath wrote:
1.) in einem Dialog zum Programmstart den Text eines Labels ändern will, klappt das nicht so, wie gedacht. Es geht nur, wenn ich das innerhalb der setupUi mache.
Doch, es klappt auch anders:
class MyDialog(QtGui.QDialog): def __init__(self, parent): self.ui = Ui_Dialog() self.ui.setupUi(self) self.ui.textLabel.setText("InitialContent") def changeText(self, newtext) self.ui.textLabel.setText(newtext)
Dann irgendwo anders:
dialog = MyDialog() dialog.changeText("FOO")
setupUi willst du nicht aendern, das ist generierter Code und deine Aenderungen werden ueberschrieben sobald du das .ui file aenderst.
2.) ich den WindowTitle z. B. als Reaktion auf einen Klick auf einen Button ändern möchte, wird der Titel nicht geändert.
Du meinst self.setWindowTitle("Foo") funktioniert nicht, wenn self eine Instanz von QWidget oder abgeleiteter Klasse ist? Das waere sehr merkwuerdig.
Bei PyQt3 klappte das alles immer... ich schätze, es hat sich was am Konzept mit der Version 4 geändert. Nun suche ich schon wochenlang in der Doku und google fleissig rum, werde aber nicht fündig. Kann jemand helfen?
Ja da hat sich einiges geaendert. Allerdings ist die Designer-Dokumentation von TT recht ausfuehrlich, man muss nur die relevanten Teile von C++ auf Python uebersetzen. Das sollte nicht sooo schwer sein, wenn man die Syntax von C++ ein klein wenig kennt. Auch die PyQt4 Doku hat IIRC ein paar Hinweise.
Im wesentlichen leitest du jetzt nicht mehr von deinem designten Formular ab, sondern direkt von QWidget oder der jeweiligen Subklasse. Das was du mit designer in ein .ui gespeichert hast und mit pyuic in Python code ueberfuehrt wendest du dann auf deine Instanz eines widgets an und setupUi erzeugt die ganzen Objekte und setzt sie ins Layout. Wenn du also das ui-Objekt "behaelst" kannst du sehr einfach auf die ganzen GUI-Elemente zugreifen.
Ich kommentiere den Code nicht weiter, weil das hinten und vorne nicht passt.
Andreas
participants (3)
-
Andreas Pakulat
-
Daniel Hagemeister-Biernath
-
Gerhard Häring