statusBar() von MainWindow in einer Klasse ansprechen
-
- Beiträge: 91
- Registriert: 14. Mai 2007 11:19
- Wohnort: Salzburg
- Kontaktdaten:
statusBar() von MainWindow in einer Klasse ansprechen
Hallo,
ich habe eine eigene Klasse entworfen und diese per h-File in meine Hauptapplikation inkludiert und aufgerufen. Funktioniert auch 1A. Nun möchte ich gerne in dieser Klasse die statusBar() von MainWindow ansprechen....
Wie geht das??? Sorry für diese Anfängerfrage....
ich habe eine eigene Klasse entworfen und diese per h-File in meine Hauptapplikation inkludiert und aufgerufen. Funktioniert auch 1A. Nun möchte ich gerne in dieser Klasse die statusBar() von MainWindow ansprechen....
Wie geht das??? Sorry für diese Anfängerfrage....
-
- Beiträge: 91
- Registriert: 14. Mai 2007 11:19
- Wohnort: Salzburg
- Kontaktdaten:
-
- Beiträge: 91
- Registriert: 14. Mai 2007 11:19
- Wohnort: Salzburg
- Kontaktdaten:
Der Designer erstellt mir automatisch eine QStatusBar im MainWindow.
Wenn ich in meiner MainWindow Applikation nun die QStatusBar ansprechen will funktioniert dies nicht:
dies jedoch funkioniert:
In einer im MainWindow inkludierten Klasse funktioniert beides nicht....
Ich hab total den Durchblick verloren ...
Kann jemand licht ins Dunkle bringen?
Code: Alles auswählen
statusbar = new QStatusBar(MainWindow);
Code: Alles auswählen
statusbar()->showMessage(tr("Drucken wird vorbereitet..."),2000);
Code: Alles auswählen
statusBar()->showMessage(tr("Drucken wird vorbereitet..."),2000);
Ich hab total den Durchblick verloren ...
Kann jemand licht ins Dunkle bringen?
-
- Beiträge: 91
- Registriert: 14. Mai 2007 11:19
- Wohnort: Salzburg
- Kontaktdaten:
Hilfe!!!
Ich verstehs einfach nicht...
... liegt wohl an fehlenden C++ Kentnissen.
Ich inklutiere per h-File. meine MainWindow Klasse in meine andere Klasse. Anschließend stelle ich die Klasse zu Verfügung und erstelle einen Pointer.
klasse.h:
klasse.cpp
Somit sollte mir MainWindow in der Klasse zu Verfügung stehen und die StatusBar ebenso (dachte ich). Wenn ich das Programm starte kommt es zu folgender Fehlermeldeung: Segmentation fault (core dumped). Somit habe ich irgendow einen Speicherfehler....
Ich habe gelesen, dass eigene Klassen so unabhängig wie möglich programmiert werden sollen ... Dies wäre in diesem Fall auch nicht erfüllt, die die Klasse ohne MainWindow nicht funktioniert...
Findet sich irgendein Guru, der sich die Mühe macht mir zu zeigen wie man die StatusBar im MainWindow in eigenen inkludierten Klassen nutzen kann...
... liegt wohl an fehlenden C++ Kentnissen.
Ich inklutiere per h-File. meine MainWindow Klasse in meine andere Klasse. Anschließend stelle ich die Klasse zu Verfügung und erstelle einen Pointer.
klasse.h:
Code: Alles auswählen
#include "mainwindow.h"
class MainWindow
private:
MainWindow *mw;
Code: Alles auswählen
...
epm->statusBar()->showMessage(trUtf8("Berechnung der Statistik läuft!"), 2000);
...
Ich habe gelesen, dass eigene Klassen so unabhängig wie möglich programmiert werden sollen ... Dies wäre in diesem Fall auch nicht erfüllt, die die Klasse ohne MainWindow nicht funktioniert...
Findet sich irgendein Guru, der sich die Mühe macht mir zu zeigen wie man die StatusBar im MainWindow in eigenen inkludierten Klassen nutzen kann...
Code: Alles auswählen
epm->statusBar()->showMessage(trUtf8("Berechnung der Statistik läuft!"), 2000);
Code: Alles auswählen
mw->statusBar()->showMessage(trUtf8("Berechnung der Statistik läuft!"), 2000);
Aber abgesehen davon hast du ja selber erkannt, dass dieser Weg sch.. ist
Ein anderer Vorschlag: Stelle in deinem Child-Panel ein "Ich-habe-was-zu-sagen"-Signal bereit:Ich habe gelesen, dass eigene Klassen so unabhängig wie möglich programmiert werden sollen
Code: Alles auswählen
signals:
void aMessage(QString msg);
Code: Alles auswählen
public slots:
void writeLogMessage(QString msg);
* die Klasse "klasse.h" ist unabhaengig vom Haupt-Fenster
* das Signal "aMessage" kann nicht nur fuer die Status-Zeile, sondern auch z.B. fuer eine Log-File verwendet werden..
hth...
-
- Beiträge: 91
- Registriert: 14. Mai 2007 11:19
- Wohnort: Salzburg
- Kontaktdaten:
Danke für deine rasche Antwort. In den Grundzügen verstehe ich deinen Vorschlag nur an der Umsätzung gibts Probleme:
In meiner Klasse stelle ich das Signal bereit
statistics.h
Nun deklariere ich im klass.cpp die Funktion:
statistics.cpp
Nun schreibt mir der compiler, dass statusMessage(QString msg) bereits definiert wurde ... ???
Ich hab mir auch im assistant den Bereich Signals and Slots angesehen, dort wird das auch so gemacht. Was mache ich denn falsch? Im Assistant wird von QObject geerbt. Hier erbe ich von QDialog welches doch QObject inkludiert hat, oder?
In meiner Klasse stelle ich das Signal bereit
statistics.h
Code: Alles auswählen
class statistics : public QDialog,
private Ui::statistics_ui
{
Q_OBJECT
public:
statistics();
~statistics();
public slots:
void getStatistics();
signals:
void statusMessage(QString msg);
protected:
private slots:
private:
statistics.cpp
Code: Alles auswählen
void statistics::statusMessage(QString msg)
{
msg = trUtf8("Hallo Statusleiste");
}
Ich hab mir auch im assistant den Bereich Signals and Slots angesehen, dort wird das auch so gemacht. Was mache ich denn falsch? Im Assistant wird von QObject geerbt. Hier erbe ich von QDialog welches doch QObject inkludiert hat, oder?
Du solltest dringend Signals und Slots mal anschauen
http://de.wikipedia.org/wiki/Signal-Slo ... _und_Slots
Das Signal wird automatisch vom moc erzeugt (deshalb das Makro Q_OBJECT)
Eine Nachricht versenden tust du dann ganz einfach:
das ist alles was du in deiner Child-Klasse machen musst...
http://de.wikipedia.org/wiki/Signal-Slo ... _und_Slots
Das Signal wird automatisch vom moc erzeugt (deshalb das Makro Q_OBJECT)
Eine Nachricht versenden tust du dann ganz einfach:
Code: Alles auswählen
emit statusMessage("Hallo Statusleiste");
-
- Beiträge: 91
- Registriert: 14. Mai 2007 11:19
- Wohnort: Salzburg
- Kontaktdaten:
Danke für deine ausführliche Hilfe. Genau das was ich gesucht habe. Leider check ichs noch immer nicht. Hab die Anleitung auf Wikipedia befolgt
Ich hab ein public SIGNAL in meiner Klasse erstellt und rufe wann immer ich eine Message ausgeben will emit statusMessage("Inhalt"); auf.
statistics.h:
Im MainWindow erstelle ich einen public SLOT
MainWindow.h
Nun deklariere ich im MainWindow.cpp den SLOT
im Konstruktor binde ich meine Klasse ein und rufe dann die connection auf:
Nun erhalte ich die Fehlermeldung, dass die Klasse keine Funktion statusMessage hat:
Object::connect: No such signal statistics::statusMessage(QString msg)
Ich sollte vielleicht zuerst meine c++ Kenntnisse vertiefen, bevor ich mich mit solchen Dingen beschäftige ...
Ich hab ein public SIGNAL in meiner Klasse erstellt und rufe wann immer ich eine Message ausgeben will emit statusMessage("Inhalt"); auf.
statistics.h:
Code: Alles auswählen
signals:
void statusMessage(QString msg);
MainWindow.h
Code: Alles auswählen
slots:
void writeMessage(QString msg);
Code: Alles auswählen
void EPManager2007::writeMessage(QString msg)
{
statusBar()->showMessage(msg, 2000);
}
Code: Alles auswählen
// Statistik einbinden
statistics *stat = new statistics();
dockWidgetDetails->setWidget(stat);
connect(stat, SIGNAL(statusMessage(QString msg)), this, SLOT(writeMessage(QString msg) ) );
Object::connect: No such signal statistics::statusMessage(QString msg)
Ich sollte vielleicht zuerst meine c++ Kenntnisse vertiefen, bevor ich mich mit solchen Dingen beschäftige ...
neinnein.. ich glaub du hast das alles richtig verstanden.. Aber du darfst keine Variabeln-Namen in die SLOT/SIGNAL-Makros einfügen:
dann sollte es gehen..
Code: Alles auswählen
connect(stat, SIGNAL(statusMessage(QString)), this, SLOT(writeMessage(QString) ) );
-
- Beiträge: 91
- Registriert: 14. Mai 2007 11:19
- Wohnort: Salzburg
- Kontaktdaten: