Seite 1 von 2

Methode aus anderer Klasse aufrufen

Verfasst: 2. Mai 2010 20:11
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

Verfasst: 2. Mai 2010 20:41
von franzf
Wo (speziell aus welcher Klasse heraus) wird denn der Dialog geöffnet?

Verfasst: 2. Mai 2010 22:06
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....

Verfasst: 3. Mai 2010 07:58
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 ;)

Verfasst: 3. Mai 2010 10:01
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

Verfasst: 3. Mai 2010 10:15
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 ;)

Verfasst: 3. Mai 2010 10:50
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?

Verfasst: 3. Mai 2010 13:35
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.

Verfasst: 3. Mai 2010 13:39
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);
    }

}

Verfasst: 3. Mai 2010 13:44
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.

Verfasst: 3. Mai 2010 13:53
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.

Verfasst: 3. Mai 2010 13:56
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?

Verfasst: 3. Mai 2010 14:15
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*'

Verfasst: 3. Mai 2010 14:18
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)

Verfasst: 3. Mai 2010 14:23
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();
}

}