0

我有两个班,MyClassWidget。下面是课程,我想MyClass从我的课程中获取变量。这是怎么做的?Widgetstr

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
}
4

2 回答 2

1

如果您希望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;
}

用一个你想做的例子来修改你的问题会很有帮助。

于 2013-06-19T19:46:22.960 回答
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)));
于 2013-06-19T20:02:24.920 回答