Seite 1 von 1

statusBar() von MainWindow in einer Klasse ansprechen

Verfasst: 7. Juni 2007 18:46
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....

Verfasst: 7. Juni 2007 20:26
von upsala
In dem du von deiner QStatusBar einen Pointer an deine Klasse übergibst...

Verfasst: 7. Juni 2007 21:00
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...

Verfasst: 7. Juni 2007 21:49
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?

Verfasst: 7. Juni 2007 21:59
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

Hilfe!!!

Verfasst: 9. Juni 2007 09:34
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...

Verfasst: 9. Juni 2007 11:13
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...

Verfasst: 9. Juni 2007 12:21
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?

Verfasst: 9. Juni 2007 12:27
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...

Verfasst: 9. Juni 2007 13:38
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:

Verfasst: 9. Juni 2007 13:52
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..

Verfasst: 9. Juni 2007 14:05
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!