Alexandre SOLLIER
Alexandre SOLLIER

Reputation: 33

Qt Change label text from another class

i'm trying to change the label text of Class A via Class B using Qt but i can't get it working, here's my codes:

Class A:

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

using namespace std;

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

    LoLData *lold = new LoLData();

    QObject::connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(updateData()));
    QObject::connect(lold, SIGNAL(updatePlayerID(QString)), ui->label, SLOT(setText(QString)));
}

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

void MainWindow::updateData()
{
    LoLData summoner;
    summoner.getSummonerData("Snylerr");
}

Class A: (.h)

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QObject>
#include <string>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void updateData();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

Class B:

#include "loldata.h"
#include "mainwindow.h"

using namespace std;

int LoLData::getSummonerData(QString playerName)
{
    emit updatePlayerID("playerName");
    return 0;
}

Class B: (.h)

#ifndef DEF_LOLDATA
#define DEF_LOLDATA

#include <QApplication>
#include <QObject>
#include <string>

class LoLData : public QObject
{
    Q_OBJECT

public:
    int getSummonerData(QString playerName);

signals:
    void updatePlayerID(QString playerName);

private:
};

#endif

You can see that i tried to use slots and signals but the text of the label is not changing, i saw a lot of examples on internet but i can't get them working Thanks for your reply.

Upvotes: 0

Views: 2234

Answers (2)

Ervin Szilagyi
Ervin Szilagyi

Reputation: 16775

You are creating a new instance of LoLData here:

void MainWindow::updateData()
{
    LoLData summoner;
    summoner.getSummonerData("Snylerr");
}

This instance of LoLData named summoner is not connected to your label's setText slot.

LoLData *lold = new LoLData(); - this instance of LolData is connected to you label's setText slot.

What should yo do? It depends on what you want to accomplish:

  1. either connect your summoner instance to the label by inserting a QObject::connect(&summoner...) inside yourupdateData` method;

  2. or you don't instantiate a new LolData variable and use lold inside your updateData function:

    void MainWindow::updateData() { lold->getSummonerData("Snylerr"); }

Also in this case you have to put lold as a member variable.

Upvotes: 1

Simon
Simon

Reputation: 11

In your MainWindow constructor, you connect your lold object to the setText slot.

But in updateData, you use an other object (summoner) which is not connect to anything. So when you use getSummonerData on summoner, the signal updatePlayerID is emitted nut they is no slot connected to it.

Upvotes: 1

Related Questions