Ü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_Haus 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; }; #endifmain.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 einerfriend 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.