Inhalt der Statusbar ändern

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Splash-1st
User
Beiträge: 5
Registriert: Sonntag 7. August 2011, 14:51

Hallo!

Ich habe noch nicht vor allzu langer Zeit angefangen mit Python und PyQt herumzuspielen. Bin also noch butiger Anfänger. :-) Ich verwende Python 2.7 und PyQt4 4.8 unter Linux (openSUSE).

Ich habe zwei Probleme bei denen ich nicht weiterkomme:
1. Ich möchte in der Statusbar einen Text erscheinen lassen wenn der Benutzer mit der Maus über einen Eintrag in der Toolbar fährt.
2. Ich möchte aus einen zentralen WIdget heraus, welches über eine Klasse definiert wird, ebenfalls den Inhalt der Statusbar manipulieren.


zu 1:
Ich meine in der Doku zu PyQt4 gelesen zu haben über den Slot "showMessage()" den Inhalt der Statusbar setzen zu können. Das funktioniert nur leider nicht. Hier der entsprechende Befehl:

Code: Alles auswählen

self.connect(self.exit, QtCore.SIGNAL("hovered()"), self.statusBar(), QtCore.SLOT("showMessage()"))
Mein Programm startet, gibt aber auf der Konsole folgende Fehlermeldung aus:
"Object::connect: No such slot QStatusBar::showMessage()"

Wo liegt mein Denkfehler?

zu 2:
Das zentrale Widget definiere ich in der Klasse "CentralWidget". Aus dieser Klasse heraus möchte ich nun den Inhalt der Statusbar ändern. Hier als Beispiel wenn der Knopf gedrückt wird.

Ich bekomme es einfach nicht hin auf die Statusbar zuzugreifen. Da die Klasse "CentralWidge" aus der Klasse "MainWindow" heraus aufgerufen wird müste das doch machbar sein. Hier fehlt mir noch das Verständnis...


Ich bin für jeden Hilfe dankbar! Untern der Code auf den ich mich beziehe.


Code: Alles auswählen

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtGui, QtCore


class CentralWidget(QtGui.QWidget):
    """
    Zentrales Widget des Hauptfensters erzeugen
    """
    def __init__(self):
        QtGui.QWidget.__init__(self)

        self.centralWidget = QtGui.QWidget()
        self.initWidget()


    def initWidget(self):
        self.directoryButton = QtGui.QPushButton("Open &Directory")
        self.connect(self.directoryButton, QtCore.SIGNAL("clicked()"),
                     self.changeStatusBar)

        grid = QtGui.QGridLayout()
        grid.addWidget(self.directoryButton, 0, 0)
        self.setLayout(grid)


    def changeStatusBar(self):
        """
        Text der Statusbar des Hauptfensters verändern
        """
        self.MainWindow.statusBar().showMessage("Button clicked")




class MainWindow(QtGui.QMainWindow):
    """
    Main Window mit Toolbar und Statusbar erzeugen
    """
    def __init__(self):
        QtGui.QMainWindow.__init__(self)

        #self.resize(250, 150)
        self.setWindowTitle('Status Bar')

        self.statusBar().showMessage("Status Bar")

        #Toolbar und Aktionen erzeugen
        self.createActions()
        self.createToolBar()

        self.centralWidget = CentralWidget()
        self.setCentralWidget(self.centralWidget)


    def createActions(self):
        """
        Aktionen
        """
        self.exit = QtGui.QAction(QtGui.QIcon("icons/application-exit.png"), "&Quit", self)
        self.connect(self.exit, QtCore.SIGNAL("triggered()"), QtCore.SLOT("close()"))
        self.connect(self.exit, QtCore.SIGNAL("hovered()"), self.statusBar(), QtCore.SLOT("showMessage()"))


    def createToolBar(self):
        """
        Toolbar
        """
        self.toolbar = self.addToolBar('Quit')
        self.toolbar.addAction(self.exit)




app = QtGui.QApplication(sys.argv)

gui = MainWindow()
gui.show()

sys.exit(app.exec_())
BlackJack

@Splash-1st: Zu 1: Du versuchst da anscheinend etwas nachzubauen was sowieso schon das Standardverhalten ist. Du musst einfach nur mit `QAction.setStatusTip()` den Text setzen der in der Statuszeile angezeigt werden soll wenn der Benutzer mit der Maus über die Schaltfläche in der Werkzeugleiste fährt.

Ansonsten solltest Du zum Verbinden von Signalen die modernere Variante in Betracht ziehen:

Code: Alles auswählen

        # self.connect(self.exit, QtCore.SIGNAL("triggered()"), QtCore.SLOT("close()"))
        # ->
        self.exit.triggered.connect(self.close)
Das ist kürzer und falls man sich bei Signal oder Slot vertippt, bekommt man das sofort in der Zeile dort oben um die Ohren gehauen.
Splash-1st
User
Beiträge: 5
Registriert: Sonntag 7. August 2011, 14:51

Vielen Dank! Über 'setStatusTip' bin ich noch nicht gestolpert. Funktioniert natürlich wie erwartet, :-)

Meinen Signal-Slot Code werde ich ändern, der ist wirklich eingängiger. Das Lehrbuch welches ich zur Hand habe behandelt noch die Alte.


Grüße!
Antworten