[gelöst] QStatusBar in QWidget

Verschiedenes zu Qt
Antworten
Pixtar
Beiträge: 97
Registriert: 5. Mai 2010 15:32

[gelöst] QStatusBar in QWidget

Beitrag 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
Zuletzt geändert von Pixtar am 27. Mai 2010 10:04, insgesamt 1-mal geändert.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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 ;)
Pixtar
Beiträge: 97
Registriert: 5. Mai 2010 15:32

Beitrag 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:
Pixtar
Beiträge: 97
Registriert: 5. Mai 2010 15:32

Beitrag 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:
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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
Pixtar
Beiträge: 97
Registriert: 5. Mai 2010 15:32

Beitrag von Pixtar »

fanzf ich danke dir vielmals. Nun steht der StatusBar und funktioniert endlich so wie es soll!
Antworten