GUI Update mittels "connect()"

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
BieJay
Beiträge: 4
Registriert: 13. Mai 2015 11:54

GUI Update mittels "connect()"

Beitrag von BieJay » 14. Mai 2015 17:42

Moin,
ich beschäftige mich seit neuestem mit C++ und QT.
Trotz C++ Fachbuch und Online-Tutorials von QT, habe ich da anscheinend noch Verständnisprobleme.

Ich habe hier erstmal ein einfaches QWidget - Programm erstellt um mein Problem vereinfacht darzustellen.

Das Programm beinhaltet:
ein Label (ui->label),
einen PushButton (pushButton)

Nachdem ich auf den Pushbutton gedrückt habe, würde ich gerne das Label ändern.
Und ja ich weiß, dass man das ganz simpel lösen kann indem man
"ui->label->setText("ABC");
schreiben kann. Ich will aber aus Verständnisgründen es hier in diesem Beispiel mit QObject::connect(...) lösen.

Also erst wird beim pushButton Drücken die Funktion "Klasse::function();" ausgelöst, von dort wird die 2te "Klasse2::function2();" ausgelöst.
In beiden Funktionen wird ein Signal gesendet, das den Labeltext ändern soll.
In "Klasse:function()" funktioniert es, das Label ändert sich zu "Hallo"
Aber sobald aus der Funktion eine weitere Funktion einer anderen Klasse aufgerufen wird, wird zwar richtig die Funktion "MainWindow::changeText()" ausgeführt, aber das Label wird nicht geändert.
Wodran liegt das?

mainwindow.h

Code: Alles auswählen

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void changeText(QString);

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};

class Klasse : public QObject
{
    Q_OBJECT

public:
    void funktion();

signals:
    void go(QString);

};
class Klasse2 : public QObject
{
    Q_OBJECT

public:
    void funktion2();

signals:
    void go2(QString);

};

#endif // MAINWINDOW_H

mainwindow.cpp

Code: Alles auswählen

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::changeText(QString text)
{
    ui->label->setText(text);
    qDebug() << "ChangeText ausgeführt" << text;
}

void Klasse2::funktion2()
{
    Klasse2 kl2;
    MainWindow mw;
   QObject::connect(this, SIGNAL(go2(QString)), &mw, SLOT(changeText(QString)));
    emit go2("Hallo");

    qDebug() << "Funktion2() ausgeführt";
}

void Klasse::funktion()
{
    Klasse2 kl2;
    kl2.funktion2();
    
    emit go("Hallo1");
    
    qDebug() << "Funktion1() ausgeführt";
}

void MainWindow::on_pushButton_clicked()
{
    Klasse kl;
    Klasse2 kl2;

    QObject::connect(&kl, SIGNAL(go(QString)), this, SLOT(changeText(QString)));

    kl.funktion();
}

Christian81
Beiträge: 7315
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: GUI Update mittels "connect()"

Beitrag von Christian81 » 14. Mai 2015 20:38

C++ Grundlagen - wie lange wird "mw" wohl leben?

Code: Alles auswählen

void Klasse2::funktion2()
{
    Klasse2 kl2;
    MainWindow mw;
   QObject::connect(this, SIGNAL(go2(QString)), &mw, SLOT(changeText(QString)));
    emit go2("Hallo");

    qDebug() << "Funktion2() ausgeführt";
}
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung

BieJay
Beiträge: 4
Registriert: 13. Mai 2015 11:54

Re: GUI Update mittels "connect()"

Beitrag von BieJay » 14. Mai 2015 22:51

Ja, habe etwas weiter rumprobiert und gemerkt, dass da der Fehler liegt.
Aber das Hauptobjekt der Klasse MainWindow wird ja beim Start des Programmes aufgerufen.
Wie komm ich an dieses "Haupt"objekt?
Oder klappt es indem ich ein Objekt von MainWindow in den Heap lade?

Christian81
Beiträge: 7315
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: GUI Update mittels "connect()"

Beitrag von Christian81 » 15. Mai 2015 08:38

z.B. indem Du einen Pointer von Mainwindow an Klasse2 übergibst.
Bei on_pushButton_clicked() hast du das Gleich Problem btw.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung

BieJay
Beiträge: 4
Registriert: 13. Mai 2015 11:54

Re: GUI Update mittels "connect()"

Beitrag von BieJay » 15. Mai 2015 14:19

Ja vielen Dank, das mit dem Pointer brauchte ich als Denkanstoß.
Auch wenn ich es nun etwas anders gelöst habe.

Ich habe in pushButton_Clicked() jeweils eine Instanz der Klassen "Klasse" und "Klasse2" erzeugt.
Und dann einen Pointer von Klasse2 an die "function()" von "Klasse" gesendet.

mainwindow.h

Code: Alles auswählen

class Klasse2 : public QObject
{
    Q_OBJECT

public:
    void funktion2();

signals:
    void go2(QString);

};

class Klasse : public QObject
{
    Q_OBJECT

public:
    void funktion(Klasse2*);

signals:
    void go(QString);

};
mainwindow.cpp

Code: Alles auswählen

void Klasse2::funktion2()
{
    qDebug() << "Funktion2() ausgeführt";
    emit go2("Hallo2");
}

void Klasse::funktion(Klasse2* ptrc)
{
    qDebug() << "Funktion1() ausgeführt";
    emit go("Hallo1");

    ptrc->funktion2();
}

void MainWindow::on_pushButton_clicked()
{
    qDebug() << "PushButton wurde gedrückt";
    Klasse *class1 = new Klasse();
    Klasse2 *class2 = new Klasse2();

    QObject::connect(class1, SIGNAL(go(QString)), this, SLOT(changeText(QString)));
    QObject::connect(class2, SIGNAL(go2(QString)), this, SLOT(changeText(QString)));

    class1->funktion(class2);

    delete class1;
    delete class2;
}
Funktioniert :mrgreen:

Wenn ich nun einen Pointer von "MainWindow" an Klasse2 geschickt hätte, hätte ich meiner Meinung nach mehr Arbeit gehabt, oder sehe ich das falsch?
Denn dann hätte ich ja erst den Pointer an "function()" schicken müssen und von da aus weiter an "function2()". Oder verkompliziere ich das gerade nur unnötig? :?

Christian81
Beiträge: 7315
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: GUI Update mittels "connect()"

Beitrag von Christian81 » 16. Mai 2015 10:11

Man kann den Pointer auch als Member-Variable speichern
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung

BieJay
Beiträge: 4
Registriert: 13. Mai 2015 11:54

Re: GUI Update mittels "connect()"

Beitrag von BieJay » 16. Mai 2015 21:19

Aahh...Doch so einfach.

Danke hat mir sehr geholfen :)

So langsam kann ich mich mit der Sprache anfreunden. Ist nur ein komplett anderes Denken, wenn man vorher nur die webbasierten Sprachen konnte.

Antworten