statusBar() von MainWindow in einer Klasse ansprechen

Alles rund um die Programmierung mit Qt
Antworten
pfusterschmied
Beiträge: 91
Registriert: 14. Mai 2007 11:19
Wohnort: Salzburg
Kontaktdaten:

statusBar() von MainWindow in einer Klasse ansprechen

Beitrag von pfusterschmied »

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....
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

In dem du von deiner QStatusBar einen Pointer an deine Klasse übergibst...
pfusterschmied
Beiträge: 91
Registriert: 14. Mai 2007 11:19
Wohnort: Salzburg
Kontaktdaten:

Beitrag von pfusterschmied »

Danke für den Hinweis!
Da ich ein c++ Anfänger bin, fehlt mir im Moment noch der Durchblick wie ich das genau anstelle, werde mich aber gleich schlau machen...
pfusterschmied
Beiträge: 91
Registriert: 14. Mai 2007 11:19
Wohnort: Salzburg
Kontaktdaten:

Beitrag von pfusterschmied »

Der Designer erstellt mir automatisch eine QStatusBar im MainWindow.

Code: Alles auswählen

statusbar = new QStatusBar(MainWindow);
Wenn ich in meiner MainWindow Applikation nun die QStatusBar ansprechen will funktioniert dies nicht:

Code: Alles auswählen

statusbar()->showMessage(tr("Drucken wird vorbereitet..."),2000);
dies jedoch funkioniert:

Code: Alles auswählen

statusBar()->showMessage(tr("Drucken wird vorbereitet..."),2000);
In einer im MainWindow inkludierten Klasse funktioniert beides nicht....

Ich hab total den Durchblick verloren ...
Kann jemand licht ins Dunkle bringen?
buhrmi
Beiträge: 18
Registriert: 21. Oktober 2006 14:43
Kontaktdaten:

Beitrag von buhrmi »

Du musst der "inkludierten" Klasse einen Pointer auf dein Mainwindow übergeben. Sonst hat deine Klasse keine Ahnung von der existenz eines Mainwindows und somit auch keine Ahnung WESSEN statusbar sie ändern soll...

google -> c++ tutorial
pfusterschmied
Beiträge: 91
Registriert: 14. Mai 2007 11:19
Wohnort: Salzburg
Kontaktdaten:

Hilfe!!!

Beitrag von pfusterschmied »

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:

Code: Alles auswählen

#include "mainwindow.h"
class MainWindow

private:
	MainWindow *mw;
klasse.cpp

Code: Alles auswählen

...
epm->statusBar()->showMessage(trUtf8("Berechnung der Statistik läuft!"), 2000);

...

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...
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Code: Alles auswählen

epm->statusBar()->showMessage(trUtf8("Berechnung der Statistik läuft!"), 2000); 
was ist "epm" .. meinst du nicht eher

Code: Alles auswählen

mw->statusBar()->showMessage(trUtf8("Berechnung der Statistik läuft!"), 2000); 
Ausserdem muss du noch den this-Pointer von MainWindow an dein Child uebergeben (via Konstruktor oder eigene "setParent"-Methode.

Aber abgesehen davon hast du ja selber erkannt, dass dieser Weg sch.. ist
Ich habe gelesen, dass eigene Klassen so unabhängig wie möglich programmiert werden sollen
Ein anderer Vorschlag: Stelle in deinem Child-Panel ein "Ich-habe-was-zu-sagen"-Signal bereit:

Code: Alles auswählen

 signals:
     void aMessage(QString msg);
Stelle im Haupt-Panel ein Slot "Ich nehme Meldungen an":

Code: Alles auswählen

  public slots:
     void writeLogMessage(QString msg);
Im Haupt-Fenster connectest du dann die beiden Methoden und hast folgende Vorteile:
* 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...
pfusterschmied
Beiträge: 91
Registriert: 14. Mai 2007 11:19
Wohnort: Salzburg
Kontaktdaten:

Beitrag von pfusterschmied »

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

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:
Nun deklariere ich im klass.cpp die Funktion:
statistics.cpp

Code: Alles auswählen

void statistics::statusMessage(QString msg)
{
	msg = trUtf8("Hallo Statusleiste");
}
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?
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Du solltest dringend Signals und Slots mal anschauen :wink:

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");
das ist alles was du in deiner Child-Klasse machen musst...
pfusterschmied
Beiträge: 91
Registriert: 14. Mai 2007 11:19
Wohnort: Salzburg
Kontaktdaten:

Beitrag von pfusterschmied »

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:

Code: Alles auswählen

signals:
	 void statusMessage(QString msg);
Im MainWindow erstelle ich einen public SLOT
MainWindow.h

Code: Alles auswählen

slots:
	 void writeMessage(QString msg);
Nun deklariere ich im MainWindow.cpp den SLOT

Code: Alles auswählen

void EPManager2007::writeMessage(QString msg)
{
	statusBar()->showMessage(msg, 2000);
}
im Konstruktor binde ich meine Klasse ein und rufe dann die connection auf:

Code: Alles auswählen

// Statistik einbinden
statistics *stat = new statistics();
dockWidgetDetails->setWidget(stat);

connect(stat, SIGNAL(statusMessage(QString msg)), this, SLOT(writeMessage(QString msg) ) );
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 ... :cry:
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

neinnein.. ich glaub du hast das alles richtig verstanden.. Aber du darfst keine Variabeln-Namen in die SLOT/SIGNAL-Makros einfügen:

Code: Alles auswählen

connect(stat, SIGNAL(statusMessage(QString)), this, SLOT(writeMessage(QString) ) ); 
dann sollte es gehen..
pfusterschmied
Beiträge: 91
Registriert: 14. Mai 2007 11:19
Wohnort: Salzburg
Kontaktdaten:

Beitrag von pfusterschmied »

oh my good, jetzt funktionierts... :lol:

Nach 2 Tagen und 50000 Haaren weniger auf dem Kopf geht die Statusleiste, ich glaubs nicht.
Vielen, vielen Dank!
Antworten