从另一个类访问变量

Access a variable from another class

本文关键字:变量 访问 另一个      更新时间:2023-10-16

我有两个类,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
}

如果您想让函数中的str变量对类或其他函数可用,这里有两个选择:

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

案例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;
}

用你想要做的例子来修饰你的问题会很有帮助。

可以发出一个以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)));