Seite 1 von 1

[gelöst] QStatusBar in QWidget

Verfasst: 26. Mai 2010 12:38
von Pixtar
Hallo Leute,

ich weiß, dass in der QT Dokumentation steht, dass QStatusBar eigentlich QMainWindow für seine Funktionalität voraussetzt, aber ich habe mein 'Hauptprogramm' von QWidget abgeleitet.

Das Erstellen eines QStatusBar's ist ja kein Problem, nur allen Elementen, die QWidget als Kinder besitzt beizubiegen, dass Sie das setStatusTip() an das selbsterstellte QStatusBar schicken.

Gefunden habe ich folgendes im QT Forum:

Code: Alles auswählen

bool event(QEvent * e){
    if ( e->type() == QEvent::StatusTip ){
        myStatusBar->showMessage(static_cast<QStatusTipEvent*>(e)->tip());
        return true;
    }
    return false;
}
Wenn ich richtig in der Annahme gehe, müsste ich diese Funktion an alle Kinder heften, damit Sie bei dem event StatusTip in das erstelle QStatusBar schreiben.

Hat jemand eine Idee wie ich das bewerkstellige, ohne von allen Kindern eine Ableitung zu machen? ... oder andere unkompliziertere Varianten damit setStatusTip() funktioniert?

Grüße Pixtar

Verfasst: 26. Mai 2010 13:50
von franzf
In QWidget::event() sendet QEvent::enter an "this" ein QStatusTipEvent. Das sollte eigentlich an alle parents weitergereicht werden. Dein Widget mit dem statusTip muss also nur ein child des MainWidget sein.
In event() das StatusTipEvent abfangen und entsprechend deine StatusBar befüllen sollte vollkommen reichen. Vollkommen ohne Ableitungen usw.
Aber eigentlich kannst du das doch ganz einfach selber ausprobieren, indem du deinen Code kompilierst und schaust was passiert ;)

Verfasst: 26. Mai 2010 16:17
von Pixtar
Ich habe ja bereits rumprobiert und bin auf keinen grünen Zweig gekommen, deshalb frage ich ja im Forum nach. ;)

Ich geb mal kurz den Aufbau preis:
-main.cpp
--mainwidget.cpp
---mainwidget.h

In der mainwidget.h liegen die Deklarationen von QGridLayout, QMenuBar, QPushButton etc.
Im Konstruktor der mainwindget.h, also im der *.cpp werden dann die Elemente definiert - Farbe/Größe/Funktion etc.

Wenn ich nun in der mainwidget.h Klasse den oben geposteten Code einfüge funktioniert die Funktion setStatusTip() des Buttons/des Menubars nicht - ganz logisch - weil die Funktion vom mainwidget aufgerufen wird und nicht vom Button oder einem Menubar.

Deshalb ja meine Frage wie ich es anstelle, das alle Elemente diese Funktion (s.1.Post) benutzen. *kopfkratz* :roll:

Verfasst: 27. Mai 2010 09:19
von Pixtar
Soo .. hier mal mein Code, denn ich schaff es einfach nicht ..

<widget.h>

Code: Alles auswählen

#ifndef WIDGET_H
#define WIDGET_H

#include <QtGui/QWidget>
#include <QStatusBar>
#include <QPushButton>
#include <QVBoxLayout>
#include <QEvent>
#include <QStatusTipEvent>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    bool event(QEvent * e);
    QStatusBar *myStatusBar;
    QPushButton *testBtn;
    QVBoxLayout *myLayer;
};

#endif // WIDGET_H
<widget.cpp>

Code: Alles auswählen

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    testBtn = new QPushButton("ShowStatus",this);
    testBtn->setStatusTip("Testbutton");
    myStatusBar = new QStatusBar(this);
    myStatusBar->setStatusTip("Statusbar");
    myLayer = new QVBoxLayout(this);
    myLayer->addWidget(testBtn);
    myLayer->addWidget(myStatusBar);
    this->setStatusTip("Startanzeige");
    this->resize(200,200);
}

bool Widget::event(QEvent * e){
    if ( e->type() == QEvent::StatusTip ){
        myStatusBar->showMessage(static_cast<QStatusTipEvent*>(e)->tip());
        return true;
    }
    return false;
}
<main.cpp>

Code: Alles auswählen

#include <QtGui/QApplication>
#include "widget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}
Zum einen funktioniert bei dem Aufbau fast das ganze Programm nicht mehr, ich denke weil event() bei allem aufgerufen wird und in diesem Fall alles abbricht - wegen false. Zum anderen zeigt der Satusbar keinerlei Inhalt an, lediglich "Statusbar" bei einem versuchten resize vom Statusbar selbst.

Kann ich nicht direkt vom Widget nur das statusTipEvent ableiten? Leider denke ich das dies nicht möglich ist, weil das statusTipEvent in dem enum von QEvent hängt .. :evil:

Verfasst: 27. Mai 2010 09:48
von franzf
Pixtar hat geschrieben:Zum einen funktioniert bei dem Aufbau fast das ganze Programm nicht mehr, ich denke weil event() bei allem aufgerufen wird und in diesem Fall alles abbricht - wegen false.
Wunderbar, dann hast du die Lösung ja gerade selber gefunden :P
Nicht false zurück geben, sondern

Code: Alles auswählen

return QWidget::event(e);
Kann ich nicht direkt vom Widget nur das statusTipEvent ableiten? Leider denke ich das dies nicht möglich ist, weil das statusTipEvent in dem enum von QEvent hängt .. :evil:
Auch QEvent::Paint "hängt direkt in dem enum von QEvent".
Du kannst ja mal ein statusTipEvent() implementieren, wirst aber keinen Erfolg haben, da in der Hierarchie du der erste sein wirst, der das implementiert :P

Verfasst: 27. Mai 2010 10:04
von Pixtar
fanzf ich danke dir vielmals. Nun steht der StatusBar und funktioniert endlich so wie es soll!