Qt 5.7: Best Practises beim Zugriff auf Variablen/Werte aus einem beliebigen Dialog



  • Hallo zusammen,

    ich wollte mich mal erkundigen, ob es Best Practises gibt, wenn ich mir verschiedenste Werte aus mehreren Dialogen holen möchte.

    Generell gehe ich aktuell wie folgt vor:

    Ich definiere die entsprechenden Funktionen um die Inhalte der privaten Objekte (Widgets, Variablen, etc.) zu lesen (z.B. getVarA()).
    Dann: Die Klasse für den Dialog löst beim Klick auf OK ein entsprechendes Signal aus, also weise ich zuerst dem Button z.B. den Slot slotApply() zu. Dieser löst entsprechend das Signal, z.B. applied(wndSomeDialog * sender) aus, übergibt also im Signal gleich das ganze Objekt:

    .h:

    public:
    	int getVarA();
    	int getVarB();
    private:
    	int a;
    	int b;
    
    public slots:
    	void slotApply();
    
    signals:
    	void applied(wndSomeDialog * sender);
    

    .cpp:

    wndSoemDialog::wndSomeDialog(QWidget *parent)
    	: QWidget(parent)
    {
    	ui.setupUi(this);
    	connect(ui.ButtonApply, SIGNAL(clicked()), this, SLOT(slotApply()));
    }
    
    void wndSomeDialog::slotApply()
    {
    	emit applied(this);
    }
    
    int wndSomeDialog::getVarA()
    {
    	return this->a;
    }
    ...
    

    Das heißt nun für mich, ich muss in der Hauptklasse des Programms nun beim Erstellen des Fensters das entsprechende Signal applied(wndSomeDialog * sender) abfangen:

    void SomeApp::createSomeDialog()
    {
    	wndSomeDialog * wsd = new wndSomeDialog(this);
    	connect(wsd, SIGNAL(applied(wndSomeDialog *)), this, SLOT(applySomething(wndSomeDialog *)));
    	wsd->show();
    }
    
    void SomeApp::applySomething(wndSomeDialog * wsd)
    {
    	int varA = wsd->getVarA();
    	int varB = wsd->getVarB();
    }
    

    So komme ich natürlich an meine Dialog-Daten, aber ist das wirklich ein eleganter Weg? Ich glaube nicht. Da fehlen mir sicherlich noch einige Grundlagen. Was wäre also der elegantere Weg oder ein guter Einstiegspunkt zum lesen? (Außer auf das Inhaltsverzeichnis von Qt hinzuweisen)

    Edit: Ich vergaß zu erwähnen: Die Dialoge/Fenster können auch mehrfach geöffnet sein. Also funktioniert es nicht, den Dialog irgendwo in der include zu definieren und dann einfach auf dieses Objekt zuzugreifen.

    Gruß,
    David



  • Ich sehe das so schon als 'best practice', also die Widget-Instanz als 'sender' zu übergeben - so machen es auch die meisten anderen Frameworks.



  • Dann bin ich ja beruhigt. 🙂
    Sah mir nur etwas stark nach einem vermeidbaren Overhead aus.


Log in to reply