Daten zwischen zwei verschiedenen Klassen austauschen

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
aken0
Beiträge: 14
Registriert: 26. Oktober 2013 14:19

Daten zwischen zwei verschiedenen Klassen austauschen

Beitrag 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 ?
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Re: Daten zwischen zwei verschiedenen Klassen austauschen

Beitrag 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'?
aken0
Beiträge: 14
Registriert: 26. Oktober 2013 14:19

Re: Daten zwischen zwei verschiedenen Klassen austauschen

Beitrag von aken0 »

Und wie mache ich das ?
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Re: Daten zwischen zwei verschiedenen Klassen austauschen

Beitrag 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.
sigvdr
Beiträge: 100
Registriert: 1. Juli 2008 19:29

Re: Daten zwischen zwei verschiedenen Klassen austauschen

Beitrag 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
MichaelS
Beiträge: 240
Registriert: 27. Dezember 2005 12:49

Re: Daten zwischen zwei verschiedenen Klassen austauschen

Beitrag 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.
aken0
Beiträge: 14
Registriert: 26. Oktober 2013 14:19

Re: Daten zwischen zwei verschiedenen Klassen austauschen

Beitrag 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;
     ^
Mr.Crank
Beiträge: 38
Registriert: 16. April 2013 15:21

Re: Daten zwischen zwei verschiedenen Klassen austauschen

Beitrag 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.
aken0
Beiträge: 14
Registriert: 26. Oktober 2013 14:19

Re: Daten zwischen zwei verschiedenen Klassen austauschen

Beitrag 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.
Antworten