Auf Inhalte eines MainWindows zugreifen

Alles rund um die Programmierung mit Qt
Antworten
Markow
Beiträge: 19
Registriert: 17. November 2011 10:54

Auf Inhalte eines MainWindows zugreifen

Beitrag von Markow »

Hi Leute, wäre es möglich aus einer beliebigen *.cpp auf Inhalte eines Fensters zuzugreifen?

in MainWindow.cpp wird ja über

Code: Alles auswählen

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
ui erzeugt. Mir ist klar, dass ich das so nicht in eine andere *.cpp quetchen kann, aber Mainwindow* ui oder ähnliches bringt mich auch nicht weiter.

Ich hoffe Ihr habt schnelle Hilfe für mich :oops:

EDIT:

Einzige und unschöne Mglichkeit, die ich auch hinbekommen habe ist Funktionen in MainWindow reinzupacken und diese von aussen aufzurufen. Mir wäre aber so ein "ui" Pointer, der von aussen läuft natürlich lieber.
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: Auf Inhalte eines MainWindows zugreifen

Beitrag von brax »

Ich glaube erstmal solltest Du Dir etwas klarer über Objekte/Klassen werden. Das hat nämmlich grundsätzlich nichts mit irgendwelchen *.cpp Dateien zu tun. Das man (vernünftigerweise) idR eine Klasse in einer .h/.cpp implementiert ist eher Konvention als Zwang.

Also wenn ich Dich richtig verstehe, möchtest Du aus Objekten anderer Klassen als Deiner MainWindow Klasse auf den Member "ui" von Deinem MainWindow Objekt zugreifen, richtig? Dann musst Du den Objekten der anderen Klassen einen Weg geben, um Dein MainWindow Objekt zu erhalten.

Da Du wahrscheinlich nur ein MainWindow hast, könntest Du dieses z.B. als Singleton (Stichwort in Google) implementieren. Dann wäre es von überall erreichbar. Singletons haben allerdings etliche Schwachstellen und Probleme (werden die Google Treffer, wenn sie gut sind, auch erwähnen).
Daher wäre die (meiner Meinung nach) zu bevorzugende Alternative, den Methoden der anderen Klassen, die tatsächlich Zugriff aufs MainWindow brauchen, das MainWindow als Parameter zu übergeben.

Wenn Du dann Dein MainWindow Objekt in der Methode der anderen Klasse hast erfolgt der Zugriff auf dessen Member (also in Deinem Fall der Member "ui") über den "."- bzw. "->"-Operator (je nachdem, ob es sich um eine Referenz oder einen Pointer auf Dein MainWindow Objekt handelt. Beispiel:

Code: Alles auswählen

void MyOtherClass::someMethod(MainWindow* pMyMainWindow) {
  pMyMainWindow->ui->doSomething(); // ruft die Methode "doSomething" am ui-Objekt des MainWindows auf
}
Da Membervariablen idR nicht public sein sollten, brauchst Du evtl noch einen getter (wieder ein Google Stichwort) für das ui Objekt.

Wenn das jetzt alles Chinesisch für Dich war, würde ich Dir ehrlich gesagt empfehlen, Dich nochmal mit den Grundlagen von C++ zu beschäftigen, bevor Du Dich mit Qt weitermachst. Ist nicht böse gemeint, sondern nur ein gut gemeinter Rat.

[Edit]: Ok, Deinem Zusatz entnehme ich, dass Du ja doch nicht ganz so weit davon entfernt bist, wenn Du in anderen Klassen schon Methoden Deines MainWindows aufrufen kannst. Dann gilt wohl nur der zweite Teil meines Posts über den Zugriff auf die Membervariable "ui" des MainWindows. Ehrlich gesagt, empfinde ich es als gar nicht so unschön, das ganze in Methoden des MainWindows zu kapseln.
Markow
Beiträge: 19
Registriert: 17. November 2011 10:54

Re: Auf Inhalte eines MainWindows zugreifen

Beitrag von Markow »

Danke für deine Antwort! Singleton ist echt unschön und da ich nicht nur ein Fenster habe nicht wirklich klug.

Mein erstes Fenster heißt im Code nur MainWindow :)

Ja ich habe jetzt den Vormittag so weitergecodet und du hast recht. So wie ich es angefangen habe ist es gar nicht so schlecht. Ich erzeuge mit der Klasse MainWindow einfach ein Objekt wo auch immer ich will und dann greife ich so auf die Methoden zu.

Ich habe bisher immer nur Konsolenanwedungen gecodet und muss sagen, dass Qt doch schon ziemlich geil ist. Ich bin nur jemand der einfach zu bld ist Dokumentationen zu verstehen :D

Ich werde gewis noch öfter von mir hren lasse!

Danke!
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: Auf Inhalte eines MainWindows zugreifen

Beitrag von brax »

Markow hat geschrieben: Ich erzeuge mit der Klasse MainWindow einfach ein Objekt wo auch immer ich will und dann greife ich so auf die Methoden zu.
Das klingt allerdings nach einer potentiellen Fehlerquelle. Wenn Du Dir immer ein neues Objekt der Klasse MainWindow erzeugst, greifst Du auch auf unterschiedliche "ui" Objekte zu, da für jedes MainWindow Objekt auch immer ein neues ui-Objekt erzeugt wird!
Markow
Beiträge: 19
Registriert: 17. November 2011 10:54

Re: Auf Inhalte eines MainWindows zugreifen

Beitrag von Markow »

Hmmm kannst du ein Beispiel nennen wo ein Fehler auftreten könnte?

Solange die Objekte nie gleichzeitig aktiv sind dürfte das doch egal sein oder nicht?
toba
Beiträge: 28
Registriert: 22. September 2011 09:28

Re: Auf Inhalte eines MainWindows zugreifen

Beitrag von toba »

Hab auch ein Projekt mit einem Hauptfenster, fast alle darin erstellten objekte haben als parent das Mainwindow, dieses parent kann man in den Child objekten aufrufen, so hast du immer einen zeiger auf das parent.
Wichtig: Hier muss man mit zeigern auf das parent arbeiten, nicht mit immer neu erstellten objekten der Klasse des parent
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: Auf Inhalte eines MainWindows zugreifen

Beitrag von brax »

Ich bin mir nicht sicher (da ich nie mit dem Designer arbeite habe ich auch nie so ein "ui" Objekt), aber wenn ich es richtig sehe, enthält doch das ui Objekt alle GUI-Elemente, oder?

Nehmen wir nun an, Du willst programatisch den Inhalt eines Textfeldes verändern, dann änderst Du mit Deinem Ansatz ein völlig anderes Textfeld, weil Du ja ein neues MainWindow-Objekt erstellst, was wiederum ein neues ui-Objekt mit einem neuen Textfeld-Objekt enthält.
Markow
Beiträge: 19
Registriert: 17. November 2011 10:54

Re: Auf Inhalte eines MainWindows zugreifen

Beitrag von Markow »

Achso ja...das stimmt.

Ich muss mal nach dem Mittagesen den Post von toba verstehen und umsetzen :)

toba kannst du vll Codeschnipsel posten wie du es gemacht hast?
toba
Beiträge: 28
Registriert: 22. September 2011 09:28

Re: Auf Inhalte eines MainWindows zugreifen

Beitrag von toba »

hups... kann gelöscht werden...
Zuletzt geändert von toba am 10. Januar 2012 13:23, insgesamt 1-mal geändert.
toba
Beiträge: 28
Registriert: 22. September 2011 09:28

Re: Auf Inhalte eines MainWindows zugreifen

Beitrag von toba »

Also nen kleiner auszug:
Habe 2 Klassen, 1Mainwindow (CMainWindow) abgeleitet von QMainwindow und 1 Wizard (CWizard) abgeleitet von QWizard

In CMainwindow erzeige ich ein Objekt von CWizard, dieser soll in CMainwindow nachher etwas bewirken.

Aufruf des Wizards:
void CMainWindow::WizardAusfuehrenSlot()
{
CWizard *wizard = new CWizard(this);
//..mehr code..
}

Header vom Wizard:
class CWizard : public QWizard
{
Q_OBJECT
public:
CWizard(QWidget *parent = 0);
//..mehr code..
}

.cpp vom Wizard:
CWizard::CWizard(QWidget *parent) :
QWizard(parent)
{
CMainWindow *ZeigerAufObjektvonCMainwindow = qobject_cast<CMainWindow *> (parent);
// bzw. auserhalb des Konstruktors:
// CMainWindow **ZeigerAufObjektvonCMainwindow = qobject_cast<CMainWindow *> (parent());
ZeigerAufObjektvonCMainwindow->VersteckeMenueSlot();
}

hoffe das ist korrekt so und hilft dir weiter.
Edit: achja, achte darauf das du eine forward deklaration benutzt, sonst kommts zu rekursionen(heißt doch so?^^)..
Markow
Beiträge: 19
Registriert: 17. November 2011 10:54

Re: Auf Inhalte eines MainWindows zugreifen

Beitrag von Markow »

Ich werde das Morgen sofort testen, danke!
Antworten