Methode aus anderer Klasse aufrufen

Du bist neu in der Welt von C++? Dann schau hier herein!
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Methode aus anderer Klasse aufrufen

Beitrag von Nvidia »

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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Wo (speziell aus welcher Klasse heraus) wird denn der Dialog geöffnet?
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Jetzt sagt er mir es ist nicht möglich ohne Objekt
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....
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

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....
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!
Aber bevor ich nicht genau weiß, welche Klasse wie und wann den Dialog öffnet, will ich nicht mehr schreiben ;)
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

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.
    }
}
Wie du das Auslesen der Dialog-Felder (das was der User eingegeben hat) machst bleibt dir überlassen. Am besten natürlich über schön benamste getter in MyDialog, der die aktuellen Werte der ui-Elemente ausgibt. Denn das ui (oder direkt die LineEdits, ComboBoxes &Co KG) public zu exponieren, widerspricht dem Gedanken der Kapselung. Du willst ja nicht dass jeder direkt deine Member verändern kann und (schlimmstenfalls) per delete auf ein Element alles kaputt macht ;)
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

ok sehr schön danke
mal eine andere frage:
in vielen Beispielen steht so was:
tr("&Hallo")
und im beispiel ist das h immer unterstrichen,warum ist das bei mir nicht so?
RavenIV
Beiträge: 267
Registriert: 21. Januar 2009 14:24
Wohnort: Waldshut

Beitrag von RavenIV »

Nvidia hat geschrieben:ok sehr schön danke
mal eine andere frage:
in vielen Beispielen steht so was:
tr("&Hallo")
und im beispiel ist das h immer unterstrichen,warum ist das bei mir nicht so?
Neue Frage, neues Thema bitte.
Linux, das längste Text-Adventure aller Zeiten
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

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*'

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.
RavenIV
Beiträge: 267
Registriert: 21. Januar 2009 14:24
Wohnort: Waldshut

Beitrag von RavenIV »

Nvidia hat geschrieben:ok aber kommt das nicht bissle dumm wenn ich dann irgentwann 10 topics offen hab xD.
Nein.
Es ist sehr viel unübersichtlicher, wenn in einem Thread viele Fragen gemischt sind.
Vor allem wird dann das Suchen unmöglich.
Linux, das längste Text-Adventure aller Zeiten
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

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.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Nvidia hat geschrieben:request for member 'exec' in '((MainWindow*)this)->MainWindow::dlg, which is non class typ of 'tabDialog*'
Ist doch auch klar...
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?
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

ok
aber wenn ich es anderes mache krieg ich nahezu den selben fehler
tabDialog *dlg = new tabDialog();
if(dlg.exec() == QDialog::Accepted)
{
QString Q = lineEdit->text();
createTab(Q);
}

request for member 'exec' in 'dlg' which is of non class 'tabDialog*'
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

C++-Grundlagen! (ist ja schonmal im richtigen Forum...).
Schau ob diese 2 Zeilen zusammenpassen!
tabDialog *dlg = new tabDialog();
if(dlg.exec() == QDialog::Accepted)
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

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();
}

}
Gesperrt