Qt更改另一个班级

时间:2017-03-18 17:47:35

标签: c++ qt text qt-signals slots

我正在尝试使用Qt通过B类更改A类的标签文本,但我无法使其正常工作,这是我的代码:

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");
}

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

B类:

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

using namespace std;

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

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

你可以看到我试图使用插槽和信号,但标签的文字没有改变,我在互联网上看到很多例子,但我不能让他们工作 谢谢你的回复。

2 个答案:

答案 0 :(得分:1)

您正在此处创建LoLData的新实例:

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

这个名为LoLData的{​​{1}}实例未与您的标签summoner广告位相关联。

setText - 此LoLData *lold = new LoLData();实例已连接到您标签的LolData广告位。

你应该怎么做? 这取决于你想要完成的任务:

  1. 通过插入setText updateData`方法将summoner实例连接到标签;

  2. 或者您没有实例化新的QObject::connect(&summoner...) inside your变量并在LolData函数中使用lold

    updateData

  3. 同样在这种情况下,您必须将void MainWindow::updateData() { lold->getSummonerData("Snylerr"); }作为成员变量。

答案 1 :(得分:0)

在MainWindow构造函数中,将 lold 对象连接到setText插槽。

但是在updateData中,你使用的是另一个没有连接任何东西的对象(召唤师)。因此,当你在召唤师上使用getSummonerData时,信号updatePlayerID被发出,它们没有连接到它的插槽。