Übertragen von Membervariablen zweier fremder Qt-bezogenen Klassen



  • Hallo Leute,
    folgendes Problem:
    Ich habe in einem mit Qt-Creator erzeugten Projekt zwei selbstdefinierte Klassen, die nicht voneinander abgeleitet sind. Die eine Klasse ist von QDialog und die andere von QGLWidget abgeleitet.
    Von beiden selbstdefinierten Klassen wird je ein Objekt in der main.cpp erzeugt und angezeigt.
    Die von QDialog abgeleitete Klasse beschreibt eine GUI, in der durch drücken eines QPushButtons die Variable "anzDr" initialisiert wird. Diese Variable wird nun im Objekt der anderen, von QGLWidget abgeleiteten Klasse benötigt.
    Frage: Wie kann der Transfer gestaltet werden?

    maindialog.h:

    #ifndef MAINDIALOG_H
    #define MAINDIALOG_H
    
    #include <QDialog>
    #include "ui_maindialog.h"
    
    class MainDialog : public QDialog, public Ui::MainDialog
    {
        Q_OBJECT
    
    public:
        MainDialog(QWidget *parent = NULL);
        ...
    public slots:
        void readFromStlClicked(); /*diese Slot-Funktion liest auf Knopfdruck einen Integer-Wert aus einer stl-Datei aus und speichert diesen in "anzDr"*/  
    private:
        unsigned long int anzDr;
        ...
    };
    #endif // MAINDIALOG_H
    

    aus maindialog.cpp:

    ...    
    connect(pushButton,SIGNAL(clicked()),
                this,SLOT(readFromStlClicked()));
    ...
    

    tetrahedron.h:

    #ifndef TETRAHEDRON_H
    #define TETRAHEDRON_H
    
    #include <QGLWidget>
    
    class Tetrahedron : public QGLWidget
    {
        Q_OBJECT
    
    public:
        Tetrahedron(QWidget *parent = 0);
        ...
    
    private:
        unsigned long int anzDr;
    };
    
    #endif
    

    main.cpp:

    #include <QApplication>
    #include <iostream>
    #include "tetrahedron.h"
    #include "maindialog.h"
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        ...
    
        MainDialog dialog;
        dialog.show();
    
        Tetrahedron tetrahedron;
        ...
    
        tetrahedron.show();
    
        return app.exec();
    }
    

    Das Problem ist: Wenn ich die "anzDr"-Variable einfach per
    objectName.get()-Funktion oder mit einer

    friend unsigned long int freund(MainDialog, Tetrahedron) {...}
    

    in der main.cpp hole, dann wird die anzDr überschrieben, bevor das manuelle Initialisieren auf Knopfdruck in der GUI erfolgen kann.
    Muss in dem Fall direkt aus der einen Klasse auf die andere Klasse zugegriffen werden (was bisher natürlich nicht geklappt hat) oder wie kann man hier überhaupt vorgehen?

    Vielen Dank für eure Hilfe



  • MainDialog könnte selbst ein Signal emittieren, quasi sigAnzahlChanged.

    In der main verbindest du

    connect(mainDialog, SIGNAL(sigAnzahlChanged(unsigned long int),
            tetrahedron, SLOT(....));
    


  • @nurf: Also eine connect-Fkt klingt gut, bin mir nicht sicher wie genau die hier angewandt wird aber hier ist ein Versuch:

    main.cpp:

    #include <QApplication>
    #include <iostream>
    #include "tetrahedron.h"
    #include "maindialog.h"
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        MainDialog *dialog = new MainDialog;
        dialog->show();
        Tetrahedron *tetrahedron = new Tetrahedron(QWidget *parent,
                                                   MainDialog *dialog);
        tetrahedron->show();
        QObject::connect(dialog->pushButton, SIGNAL(clicked()),
                         tetrahedron, SLOT(speichereDreiecke()));
        return app.exec();
    }
    

    maindialog.h:

    #include <QDialog>
    #include "ui_maindialog.h"
    #include "tetrahedron.h"
    
    class MainDialog : public QDialog, public Ui::MainDialog
    {
        Q_OBJECT
    public:
        MainDialog(QWidget *parent = 0) ;
        unsigned long int leseDreiecke(void) { return anzDr; }
    public slots:
        void readFromStlClicked();
    private:
        unsigned long int anzDr;
    };
    

    tetrahedron.h:

    #ifndef TETRAHEDRON_H
    #define TETRAHEDRON_H
    #include "maindialog.h"
    
    class Tetrahedron : public QGLWidget
    {
        Q_OBJECT
    public:
        Tetrahedron(QWidget *parent = 0, MainDialog *dialog);
        void speichereDreiecke();
    private:
        unsigned long int anzDrNEU;
    };
    

    tetrahedron.cpp:

    #include "tetrahedron.h"
    ...
    Tetrahedron::Tetrahedron(QWidget *parent, MainDialog *dialog)
        : QGLWidget(parent)
    {
        setFormat(QGLFormat...
    }
    ...
    void Tetrahedron::speichereDreiecke() {
        anzDrNEU = dialog->leseDreiecke();
    }
    

    Wenn der "pushButton" gedrückt wird, wird die Funktion "speichereDreiecke()" aufgerufen, die wiederum auf die Fuktion "leseDreiecke()" vom Objekt "dialog" zurückgreift, nur das Übertragen des Objektes der Klasse MainDialog in den Konstruktor von Tetrahedron scheint nicht zu funktionieren...
    Fehler:
    'Tetrahedron::Tetrahedron': fehlender Standartparameter fr Parameter2 tetrahedron.h
    dadurch wird "dialog" tetrahedron.cpp zum nichtdeklarierten Bezeichenr
    Kann das so in etwa funktionieren?



  • Die Idee war, dass der MainDialog ein Signal emittiert. -> Siehe Q_EMIT
    Der Rest konnte so bleiben wie er war.
    Es Bedarf keiner direkten Verbindung zwischen Tetrahedron und MainDialog.


Anmelden zum Antworten