从另一个类访问变量

时间:2013-06-19 19:33:59

标签: c++ qt qt5

我有两个班级,MyClassWidget。以下是MyClass课程,我希望从我的Widget课程中获取str变量。怎么做的?

class MyClass : public QObject
{
    Q_OBJECT

public:
    MyClass();
    void fetch(); 

public slots:
    void replyFinished(QNetworkReply*);

private:
    QNetworkAccessManager* m_manager;
};

MyClass::MyClass()
{
    m_manager = new QNetworkAccessManager(this);

    connect( m_manager, SIGNAL(finished(QNetworkReply*)),
             this, SLOT(replyFinished(QNetworkReply*)));
}

void MyClass::fetch()
{
    m_manager->get(QNetworkRequest(QUrl("http://stackoverflow.com")));
}

void MyClass::replyFinished(QNetworkReply* pReply)
{
    QByteArray data=pReply->readAll();
    QString str(data);

    //this str should be available in my widget class
}

编辑:这是小部件的重要部分

namespace Ui {
    class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_pushButton_clicked();

private:
    Ui::Widget *ui;
};

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

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

void Widget::on_pushButton_clicked()
{
    //here str should be accessed
}

2 个答案:

答案 0 :(得分:1)

如果您希望函数中的str变量可用于类或其他函数,则有以下两种选择:

  1. 从功能中返回。
  2. 在MyClass中声明一个变量来保存字符串并设置 变量值。
  3. 案例1:从函数返回

    QString MyClass::replyFinished(...)
    {
      QString str(data);
      return data;
    }
    

    案例2:声明一个类成员变量

    class MyClass
    {
      public:
         QString m_replyStr;
    };
    //...
    void MyClass::replyFinished(...)
    {
      QByteArray data = pReply->readAll();
      m_replyStr = data;
    }
    

    使用您想要做的事情的示例修改您的问题会非常有帮助。

答案 1 :(得分:1)

您可以发出str作为参数的信号,并将其连接到窗口小部件中的插槽。然后你可以用它做你想做的事。 这样,您将保留面向事件的设计,并且您无需控制str是否存在。只要它准备就绪,插槽就可以处理它。

class MyClass : public QObject
{
Q_OBJECT

public:
    MyClass();
    void fetch(); 

public slots:
    void replyFinished(QNetworkReply*);
signals:
    void strReplyReady(QString str);

private:
    QNetworkAccessManager* m_manager;
};

...

void MyClass::replyFinished(QNetworkReply* pReply)
{
    QByteArray data=pReply->readAll();
    QString str(data);
    emit strReplyRead(str);
}

你的小工具

class MyWidget : public QWidget 
{
 //public members
 ...
 public slots:
     void readReply(QString str);
}

void MyWidget::readReply(QString str){
     //do what you want with str
}

在main.cpp中,您使用QObject的静态成员

进行连接
QObject::connect(myClassPointer,SIGNAL(strReplyReay(QString)) ,
                 myWidgetPointer,SLOT(readReply(QString)));