Seite 1 von 1

Daten zwischen zwei verschiedenen Klassen austauschen

Verfasst: 27. Oktober 2013 14:30
von aken0
Guten tag,
ich habe ein kleines Problem. Ich habe in QT zwei verschiedene Fenster beziehungsweiße, zwei verschiedene Klasse. Wenn ich jetzt im MainWindow bin und das zweite Fenster mit

Code: Alles auswählen

Form *newForm = new Form;
und

Code: Alles auswählen

newForm->show();
öffne und ich in diesem Fenster beispielsweiße auf einen Button klicke, wie kann ich dann auf Objekte der Klasse von MainWindow zugreifen ? Ich habe schon viel mit pointern versucht, jedoch hat das alles nicht wirklich funktioniert. Ich habe mir jetzt ein kleiner Programm geschrieben das einfach nur die Hintergrundfarbe eines Items eines Listwidget ändert. Das ganze klappt auch prima innerhalb der MainWindow Klasse, aber wie kann ich

Code: Alles auswählen

ui->listWidget->item(0)->setBackgroundColor(Qt::blue);
auch außerhalb einer anderen Klasse benutzen, also in meinem Fall in einem zweiten Fenster ? Also das ich in einem zweiten Fenster über

Code: Alles auswählen

void Form::on_pushButton_clicked()
{
    
}
die Hintergrundfarbe des MainWindows ändern kann ?

Oder wie könnte man das anders machen, dass man Daten, Ereignise o.ä außerhalb der Klasse mit anderen Klassen austauschen kann ?

Re: Daten zwischen zwei verschiedenen Klassen austauschen

Verfasst: 28. Oktober 2013 13:10
von MichaelS
Ich habe ein kleines Problem. Ich habe in QT zwei verschiedene Fenster beziehungsweiße, zwei verschiedene Klasse. Wenn ich jetzt im MainWindow bin und das zweite Fenster [...] öffne und ich in diesem Fenster beispielsweiße auf einen Button klicke, wie kann ich dann auf Objekte der Klasse von MainWindow zugreifen ?
In dem Du einen Pointer auf das Objekt an das andere Fenster übergibt.
Ich habe schon viel mit pointern versucht, jedoch hat das alles nicht wirklich funktioniert.
Was genau hast Du versucht und was heißt 'hat nicht wirklich funktioniert'?

Re: Daten zwischen zwei verschiedenen Klassen austauschen

Verfasst: 28. Oktober 2013 21:11
von aken0
Und wie mache ich das ?

Re: Daten zwischen zwei verschiedenen Klassen austauschen

Verfasst: 28. Oktober 2013 22:34
von MichaelS
aken0 hat geschrieben:Und wie mache ich das ?
In dem Du den Pointer z.B. als Parameter im Konstruktur übergibst. Ich wiederhole meine Frage: Wie sehen Deine bisherigen Versuche mit Pointern aus? Lass doch einfach mal ein bisschen Quellcode sehen, dann kann man Dir bestimmt auch helfen.

Re: Daten zwischen zwei verschiedenen Klassen austauschen

Verfasst: 29. Oktober 2013 19:33
von sigvdr
Die Arbeit mit den Pointern nimmt dir doch Qt ab. Dafür gibt es doch das SIGNAL/SLOT Konzept von Qt.
Gruß Sig

Re: Daten zwischen zwei verschiedenen Klassen austauschen

Verfasst: 29. Oktober 2013 22:01
von MichaelS
sigvdr hat geschrieben:Die Arbeit mit den Pointern nimmt dir doch Qt ab. Dafür gibt es doch das SIGNAL/SLOT Konzept von Qt.
Gruß Sig
Das hängt aber davon ab, was genau mit "Zugreifen auf Daten und Ereignisse" gemeint ist.

Re: Daten zwischen zwei verschiedenen Klassen austauschen

Verfasst: 1. November 2013 01:31
von aken0
Entschuldige das ich mich erst jetzt melde, ich habe jetzt mal ein bisschen damit rumgespielt, aber es immer noch nicht herraus gefunden. Hier mal mein Code:

on_pb_addProfile_clicked() öffnet den zweiten Dialog mit einem Pointer auf this.
updateProfile() wird von dem zweiten Dialog benutzt, um Items in die ComboBox zu setzen
(MainLogin.cpp)

Code: Alles auswählen

#include "mainlogin.h"
#include "ui_mainlogin.h"
#include <QDebug>
MainLogin::MainLogin(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::MainLogin)
{
    ui->setupUi(this);
    ui->pb_logout->setEnabled(false);
    ui->le_passwd->setEchoMode(QLineEdit::Password);
    ui->pb_login->setDefault(true);
}

MainLogin::~MainLogin()
{
    delete ui;
}

void MainLogin::on_pb_addProfile_clicked()
{
    QString strProfile = "str";
    qDebug() << "Adresse von strProfile: " << &strProfile;
    addProfile *ap = new addProfile(0, this);
    ap->show();
}

void MainLogin::updateProfile(QString profileName)
{
    ui->cb_profile->addItem(profileName);
}

Der Zweite Dialog, im Konstruktor der Pointer auf MainLogin
(addprofile.h)

Code: Alles auswählen

#ifndef ADDPROFILE_H
#define ADDPROFILE_H

#include <QDialog>
#include <QDebug>
#include "mainlogin.h"

namespace Ui {
class addProfile;
}

class addProfile : public QDialog
{
    Q_OBJECT

public:
    explicit addProfile(QWidget *parent, MainLogin* getProfile);
    ~addProfile();
    QString* strptr2;
    MainLogin* setProfile;
private slots:
    void on_pb_abort_clicked();

    void on_pb_ok_clicked();

private:
    Ui::addProfile *ui;

};

#endif // ADDPROFILE_H

Über on_pb_ok_clicked(), wird aus einer LineEdit den QString in der Funktion updateProfile zum MainLogin übergeben.
(addprofile.cpp)

Code: Alles auswählen

#include "addprofile.h"
#include "ui_addprofile.h"

addProfile::addProfile(QWidget *parent, MainLogin* getProfile) :
    QDialog(parent),
    ui(new Ui::addProfile)
{
    ui->setupUi(this);
    setProfile = getProfile;
}

addProfile::~addProfile()
{
    delete ui;
}

void addProfile::on_pb_abort_clicked()
{
    exit(-1);
}

void addProfile::on_pb_ok_clicked()
{
    setProfile->updateProfile(ui->le_profile->text());
}

Das alles jedenfalls in der Theorie ;)
Der Compiler gibt mir jedoch zwei Fehler bei AddProfile. Dort wird gesagt, das MainLogin nicht declaniert ist.
Hier mal die Compilermeldung:
Die Zeile ist beim Konstruktor von AddProfile

Code: Alles auswählen

C:\Users\musteruser\Desktop\C++\QT\Projects\Sql-Schulplaner\Sql-Schulplaner\addprofile.h:17: Fehler:'MainLogin' has not been declared
     explicit addProfile(QWidget *parent, MainLogin* getProfile);
                                          ^
Und hier die zweite Meldung:
Das ist bei MainLogin* setProfile in AddProfile.h

Code: Alles auswählen

C:\Users\musteruser\Desktop\C++\QT\Projects\Sql-Schulplaner\Sql-Schulplaner\addprofile.h:20: Fehler:'MainLogin' does not name a type
     MainLogin* setProfile;
     ^

Re: Daten zwischen zwei verschiedenen Klassen austauschen

Verfasst: 1. November 2013 08:06
von Mr.Crank
Tach Aken,

erstmal zu deinen Fehlermeldungen, den in Z17 kann ich nicht ganz nachvollziehen dafür reichen die Ausschnitte nicht.
Ich könnte mir vorstellen, dass das Objekt nicht existiert oder du bei Funktionsaufruf mit this im falschen Objekt bist.

Wenn ich es richtig verstanden habe, sagst du in Z20 mein MainLogin*setProfile sollen die Werte von getProfile sein.
Du muss ihn meiner Meinung nach aber auch eine Speicherzelle geben probieren mal ein
setProfile = new MainLogin(); vor setProfile=getProfile


Allgemein können Pointer Übergaben genau so unnützlich sein wie sie hilfreich sind. Denn man erzeugt sich so schnell
Instanzierungsfehler die nicht immer ganz trivial sind. Sind deine Objekte also Konsistenz so nenne das Kind bei Namen
bei der Übergabe.

So nochmal Grundsätzlich zu deinem Thema, das ganze System in der objektorientierten Programmierung nennt sich
Information Hiding. Je nachdem was du bearbeiten bzw. austauschen möchtest gibt es die SIGNALS und SLOTS oder
aber du schreibst in den Klassen get/set Funktionen, sodass deine variable stets private sind und über die protected/public
Methoden parametriert werden.

Re: Daten zwischen zwei verschiedenen Klassen austauschen

Verfasst: 1. November 2013 12:14
von aken0
Okay ich habe mal MainLogin* newLogin = new MainLogin() probiert, immern noch das gleiche Problem, ich poste hier jetzt mal mein komplette QuellCode:

mainlogin.h

Code: Alles auswählen

#ifndef MAINLOGIN_H
#define MAINLOGIN_H

#include <QDialog>
#include <QMessageBox>
#include <QtSql/QSql>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlDriver>
#include <QtSql/QSqlError>
#include "addprofile.h"


namespace Ui {
class MainLogin;
}

class MainLogin : public QDialog
{
    Q_OBJECT

public:
    explicit MainLogin(QWidget *parent = 0);
    ~MainLogin();
    void updateProfile(QString profileName);
private slots:
    void on_pb_login_clicked();

    void on_pb_addProfile_clicked();

private:
    Ui::MainLogin *ui;
};

#endif // MAINLOGIN_H

mainlogin.cpp

Code: Alles auswählen

#include "mainlogin.h"
#include "ui_mainlogin.h"
#include <QDebug>
MainLogin::MainLogin(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::MainLogin)
{
    ui->setupUi(this);
    ui->pb_logout->setEnabled(false);
    ui->le_passwd->setEchoMode(QLineEdit::Password);
    ui->pb_login->setDefault(true);
}

MainLogin::~MainLogin()
{
    delete ui;
}

void MainLogin::on_pb_login_clicked()
{
    if(ui->le_host->text() == "" || ui->le_user->text() == "" || ui->le_passwd->text() == "" || ui->le_chema->text() == "")
    {
        QMessageBox::information(this, "Bitte füllen sie alles Felder aus!", "Möglicherweiße wurden nicht alle Felder richtig ausgefüllt, bitte überprüfen sie Ihre Eingaben.");
        return;
    }

    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "db");
    db.setHostName(ui->le_host->text());
    db.setUserName(ui->le_user->text());
    db.setPassword(ui->le_passwd->text());
    db.setDatabaseName(ui->le_chema->text());
    bool loginState = db.isOpen();

    if(loginState == true)
    {
        qDebug() << "succes";
    }
    else
    {
        qDebug() << db.lastError().text();
    }
}

void MainLogin::on_pb_addProfile_clicked()
{
    addProfile *ap = new addProfile(0, this);
    ap->show();
}

void MainLogin::updateProfile(QString profileName)
{
    ui->cb_profile->addItem(profileName);
}

addprofile.h

Code: Alles auswählen

#ifndef ADDPROFILE_H
#define ADDPROFILE_H

#include <QDialog>
#include <QDebug>
#include "mainlogin.h"

namespace Ui {
class addProfile;
}

class addProfile : public QDialog
{
    Q_OBJECT

public:
    explicit addProfile(QWidget *parent, MainLogin* getProfile());
    ~addProfile();
private slots:
    void on_pb_abort_clicked();

    void on_pb_ok_clicked();

private:
    Ui::addProfile *ui;
    QString* strptr2;
    MainLogin* setProfile = new MainLogin();

};

#endif // ADDPROFILE_H

addprofile.cpp

Code: Alles auswählen

#include "addprofile.h"
#include "ui_addprofile.h"

addProfile::addProfile(QWidget *parent, MainLogin* getProfile) :
    QDialog(parent),
    ui(new Ui::addProfile)
{
    ui->setupUi(this);
    setProfile = getProfile;
}

addProfile::~addProfile()
{
    delete ui;
}

void addProfile::on_pb_abort_clicked()
{
    exit(-1);
}

void addProfile::on_pb_ok_clicked()
{
    setProfile->updateProfile(ui->le_profile->text());
}

So es sind immern noch die gleichen Fehler vom Compiler, wie in meinem vorrigen Post.