Zugriff auf offene Dialoge

Alles rund um die Programmierung mit Qt
Antworten
Thomas
Beiträge: 45
Registriert: 9. September 2005 16:26

Zugriff auf offene Dialoge

Beitrag von Thomas »

Hallo,

ich öffne in meinem Programm dynamisch mehrere Dialoge, die übereinander liegen bzw. gleichzeitig geöffnet sind. Nach der Eingabe von Text im obersten Dialog, möchte ich den Text in einen anderen bestehenden Dialog kopieren. Gibt es eine Möglichkeit auf einen beliebigen geöffneten Dialog zuzugreifen? Ich habe es mit

Code: Alles auswählen

QObject* par = this->parent();
qobject_cast<ProjectDialog *>(par)->setModelList(strModelList);
versucht. Auf diese Art kann ich auf den "Parent"-Dialog des obersten Dialogs zugreifen, aber nicht auf einen, den ich vor dem "Parent"-Dialog geöffnet habe. Wie muss ich vorgehen, um auf einen anderen zugreifen zu können?

Thomas
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

parent() ist nicht korrekt, dafür gibt es parentWidget()...
Und sonst bau dir doch eine QMap mit allen Dialogen, dann hast einen leichten Zugriff auf alles. Übrigens ein Aufbau mit mehreren gleichzeitig geöffneten Dialogen ist ein Zeichen für ein schlecht durchdachtes GUI-Konzept... Nur so zum Nachdenken...
Thomas
Beiträge: 45
Registriert: 9. September 2005 16:26

Beitrag von Thomas »

Ich habe mir jetzt eine QMap zusammengestellt, in der ich als Wert Zeiger auf meine Dialoge speicher. Bei Bedarf rufe ich über eine Schlüsselwort den zeigen ab. Nach dem abrufen zeigt der Zeiger auf den richtigen Dialog (dies habe ich überprüft). Nun habe ich allerdings das Problem, dass ich auf die Membervariablen des Dialoges zugreifen kann. Ich erhalte eine Fehlermeldung, die mir sagt, dass der Lese- bzw. Schreibzugriff gelockt ist. Ich kann die Variablen weder lesen noch verändert.

Woran könnte das liegen?

Thomas
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

Code ins Studio....
Thomas
Beiträge: 45
Registriert: 9. September 2005 16:26

Beitrag von Thomas »

Ich habe in meiner MainWindow-Klasse die QMap angelegt:

Header:

Code: Alles auswählen


...
private:
   
	QMap<QString, QDialog*> *dialogMap;
};

#endif
Cpp:

Code: Alles auswählen

MainWindow::MainWindow()
{
....
dialogMap = new QMap<QString, QDialog*>;
}

void MainWindow::newProject()
// invoke the newProject dialog for creating a new I-MET project
{
    if (maybeSave() && !proDial)
    {
        proDial = new ProjectDialog(this);		
	
		dialogMap->insert("NewProjectDialog", proDial);		
		proDial->setDialogMap(*dialogMap);                  
  // Übergabe des QMap an die Dialogklasse
		proDial->exec();      
    }
}
Ist die Übergabe an die Dialogklasse sinnvoll bzw. notwendig?

Dialogklasse NewProjectDialog:

header:

Code: Alles auswählen

...
public:
void setDialogMap(QMap<QString, QDialog*> &diagMap) {dMap = diagMap;}

private:
QMap<QString, QDialog*> dMap;
};
Cpp:

Code: Alles auswählen

...
void ProjectDialog::on_cameraEditButton_clicked()
// create a new camera file or edit an existing one
// Aufruf des zweiten Dialogs vom ersten aus
{
		
        camEdit = new CameraEditorFormDialog(this);
	
	dMap.insert("CameraEditor", camEdit); // einfügen des zweiten Dialoges in die QMap	
        camEdit->setDialogMap(dMap);
// übergabe des QMap als Referenz an die zweite Dialogklasse 

	this-hide();
        camEdit->exec();	
}

Zweite Dialogklasse:

header:

Code: Alles auswählen

...
public:
void setDialogMap(QMap<QString, QDialog*> &diagMap) {dialogMap = diagMap;}

private:
QMap<QString, QDialog*> dialogMap;
};
Cpp:

Code: Alles auswählen


void ...
{

 NewProjectDialog p_newProject = (NewProjectDialog*)dialogMap.value("NewProjectDialog");
// Abruf des gespeicherten Zeigers auf den Projektdialog

p_newProject->setCameraID(ui.CameraIDEdit->text());
//Versuch eine private Variable des ProjektDialoges zu verändern -> scheitert

}

lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag von lepsai »

bei NewProjectDialog p_newProject = ..., sollte es heissen:
NewProjectDialog * p_newProject =...


Sonst sehe ich keine Fehler...
Antworten