Methode aus anderer Klasse aufrufen
Methode aus anderer Klasse aufrufen
Ich hab eine Klasse, die Ich aus QDialog abgeleitet hab.
In dieser werden Daten eingeben und mit den Daten soll nun eine Methode aus meinem Hauptfenster aufgerufen werden,
Ich hab MainWindow.h in meinen DialogHeaderfile eingebunden und würde die public Methode nun mit MainWindow::Methode1(); aufrufen.
Jetzt sagt er mir es ist nicht möglich ohne Objekt
Aber ich weiß das Objekt doch gar nicht, weil das erst in der Main erzeugt wird und ich die main nicht einbinden kann.?
??? nvidia ;D
In dieser werden Daten eingeben und mit den Daten soll nun eine Methode aus meinem Hauptfenster aufgerufen werden,
Ich hab MainWindow.h in meinen DialogHeaderfile eingebunden und würde die public Methode nun mit MainWindow::Methode1(); aufrufen.
Jetzt sagt er mir es ist nicht möglich ohne Objekt
Aber ich weiß das Objekt doch gar nicht, weil das erst in der Main erzeugt wird und ich die main nicht einbinden kann.?
??? nvidia ;D
Ich nehme irgendwie ganz stark an, dass das MainWindow den Dialog öffnet. Und dann macht man das ja viel einfacher. dialog.exec() und falls accepted -> Werte abfragen und fertig!AuE hat geschrieben:Du hast in dem Dlg kein Objekt deiner "GUI" Klasse - was auch gut so ist. Versuch das ganze via Signal Slot zu lösen - oder was spricht da gegen?
Oder alternativ ne statische Methode....
Aber bevor ich nicht genau weiß, welche Klasse wie und wann den Dialog öffnet, will ich nicht mehr schreiben
also ich hab mein klasse
MainWindow : public QMainWindow
und meinen Dialog
dialog : public QDialog
MainWindow ruft dialog aus, der Benutzer gibt Daten ein.
Jetzt muss ja der dialog, die Methode im MainWindow aufrufen und sich selbst schließen.
Das wollte ich erreichen. Aber ich glaub man macht das anderes, oder? xD
nvidia
MainWindow : public QMainWindow
und meinen Dialog
dialog : public QDialog
MainWindow ruft dialog aus, der Benutzer gibt Daten ein.
Jetzt muss ja der dialog, die Methode im MainWindow aufrufen und sich selbst schließen.
Das wollte ich erreichen. Aber ich glaub man macht das anderes, oder? xD
nvidia
Code: Alles auswählen
MainWindow::on_action_showDialog() {
MyDialog dlg;
if( dlg.exec() == QDialog::Accepted ) {
// hier kommst du hin, wenn der User "OK" klickt.
// Dialog-Felder auslesen usw.
}
}ok dann tu ich das mal.
ok ich hab das nun mal versucht.
Allerdings krieg ich folgenden Fehler:
request for member 'exec' in '((MainWindow*)this)->MainWindow::dlg, which is non class typ of 'tabDialog*'
ok ich hab das nun mal versucht.
Allerdings krieg ich folgenden Fehler:
request for member 'exec' in '((MainWindow*)this)->MainWindow::dlg, which is non class typ of 'tabDialog*'
Code: Alles auswählen
void MainWindow::on_action_showDialog()
{
dlg = new tabDialog();
if(dlg.exec() == QDialog::Accepted)
{
QString Q = lineEdit->text();
createTab(Q);
}
}
Zuletzt geändert von Nvidia am 3. Mai 2010 13:52, insgesamt 1-mal geändert.
Das ist aber keine Qt/GUI-spezifische Frage, sondern eine prinzipielle in der OOP.
Als Beispiel:
Schau dir die ganzen verschiedenen Datei-Dialoge an. Öffnen, Speichern, Verzeichnis auswählen. Die schauen alle verschieden aus, aber im Prinzip haben die eines gemein: Dateisystem "durchsuchen". Es liegt also nahe, das alles in eine Klasse zu packen und mit Methoden das exakte Verhalten festzulegen.
Und genau so kannst du es doch auch machen.
Ein Projekt importieren oder neu anlegen hat vielleicht ähnliche Einstellungen, mit dem einen Unterschied, dass das eine komplett bei NULL anfängt, das andere irgendwelche Konvertierungen in der Struktur vornimmt. Aber aussehen tun sie ähnlich. -> Eine Klasse für import/neu "ProjectWizard".
BTW: Ein Menü hat nicht viele Dialoge, es hat viele MenuItems (->QAction). Was du an die Action hängst ist egal, es muss dabei kein Dialog geöffnet werden. Oder geht bei dir mit "Menü->Berabeiten->Kopieren" ein Dialog auf?
Schau dir auch mal die statischen Methoden von QInputDialog an, villeicht reichen die dir ja.
Als Beispiel:
Schau dir die ganzen verschiedenen Datei-Dialoge an. Öffnen, Speichern, Verzeichnis auswählen. Die schauen alle verschieden aus, aber im Prinzip haben die eines gemein: Dateisystem "durchsuchen". Es liegt also nahe, das alles in eine Klasse zu packen und mit Methoden das exakte Verhalten festzulegen.
Und genau so kannst du es doch auch machen.
Ein Projekt importieren oder neu anlegen hat vielleicht ähnliche Einstellungen, mit dem einen Unterschied, dass das eine komplett bei NULL anfängt, das andere irgendwelche Konvertierungen in der Struktur vornimmt. Aber aussehen tun sie ähnlich. -> Eine Klasse für import/neu "ProjectWizard".
BTW: Ein Menü hat nicht viele Dialoge, es hat viele MenuItems (->QAction). Was du an die Action hängst ist egal, es muss dabei kein Dialog geöffnet werden. Oder geht bei dir mit "Menü->Berabeiten->Kopieren" ein Dialog auf?
Schau dir auch mal die statischen Methoden von QInputDialog an, villeicht reichen die dir ja.
Ist doch auch klar...Nvidia hat geschrieben:request for member 'exec' in '((MainWindow*)this)->MainWindow::dlg, which is non class typ of 'tabDialog*'
Schau dir an WIE du den Dialog anlegst und überlege ob du den richtigen Zugriffsoperator einsetzt.
BTW kriegst du da bei mehrmaligem Aufrufen ein schönes MemoryLeak! Immer new und kein delete...
Muss der Dialog ein Member sein? Und muss der wirklich in den dynamischen Speicherbereich?
Ja das hat mich schon immer mal interessiert, was der unterschied zwischen
QWidget Q; in Header
und Q = new QWidget;
oder gleich in der datei QWidget *Q = new QWidget
was der unterschied zwischen den beiden ist, aber in meinem buch hab ich das nicht gefunden.
tabDialog *dlg = new tabDialog();
if(*dlg.exec() == QDialog::Accepted)
Aber so funktioniert das auch ncoh, immer noch der selbe fehler.
außerdem hab ich das immer so gemacht wenn man das einmal mit *name aufgemacht hat hab ich das * nie mehr dazu benutzt er hat auch nicht gemeckert
&& ich hab den Code noch ein bisschen verbessert.
void MainWindow::on_action_showDialog()
{
tabDialog *dlg = new tabDialog();
if(*dlg.exec() == QDialog::Accepted)
{
QString Q = dlg->getLine();
createTab(Q);
Q.~QString();
dlg->~QDialog();
}
}
QWidget Q; in Header
und Q = new QWidget;
oder gleich in der datei QWidget *Q = new QWidget
was der unterschied zwischen den beiden ist, aber in meinem buch hab ich das nicht gefunden.
tabDialog *dlg = new tabDialog();
if(*dlg.exec() == QDialog::Accepted)
Aber so funktioniert das auch ncoh, immer noch der selbe fehler.
außerdem hab ich das immer so gemacht wenn man das einmal mit *name aufgemacht hat hab ich das * nie mehr dazu benutzt er hat auch nicht gemeckert
&& ich hab den Code noch ein bisschen verbessert.
void MainWindow::on_action_showDialog()
{
tabDialog *dlg = new tabDialog();
if(*dlg.exec() == QDialog::Accepted)
{
QString Q = dlg->getLine();
createTab(Q);
Q.~QString();
dlg->~QDialog();
}
}