Seite 1 von 1
Auf Inhalte eines MainWindows zugreifen
Verfasst: 10. Januar 2012 08:53
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
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.
Re: Auf Inhalte eines MainWindows zugreifen
Verfasst: 10. Januar 2012 11:00
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.
Re: Auf Inhalte eines MainWindows zugreifen
Verfasst: 10. Januar 2012 11:14
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
Ich werde gewis noch öfter von mir hren lasse!
Danke!
Re: Auf Inhalte eines MainWindows zugreifen
Verfasst: 10. Januar 2012 11:36
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!
Re: Auf Inhalte eines MainWindows zugreifen
Verfasst: 10. Januar 2012 11:43
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?
Re: Auf Inhalte eines MainWindows zugreifen
Verfasst: 10. Januar 2012 11:44
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
Re: Auf Inhalte eines MainWindows zugreifen
Verfasst: 10. Januar 2012 11:52
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.
Re: Auf Inhalte eines MainWindows zugreifen
Verfasst: 10. Januar 2012 12:25
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?
Re: Auf Inhalte eines MainWindows zugreifen
Verfasst: 10. Januar 2012 12:58
von toba
hups... kann gelöscht werden...
Re: Auf Inhalte eines MainWindows zugreifen
Verfasst: 10. Januar 2012 13:23
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?^^)..
Re: Auf Inhalte eines MainWindows zugreifen
Verfasst: 10. Januar 2012 16:07
von Markow
Ich werde das Morgen sofort testen, danke!