2013-06-19 247 views
0

我有兩個類,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 
} 
+0

哪裏是Widget類的靜態成員連接的main.cpp? –

+0

如果你想傳遞數據,你*可以讓小部件連接到networkAccessManager或讓MyClass發出一個信號讓它接收。但坦率地說,有這麼多的方法來剝皮這隻貓。 – Huy

+0

我添加了Widget類和str應該被訪問 –

回答

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

與你想做的事會很什麼的例子修改你的問題很有幫助。

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

您的Widget

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

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

在你的QObject的與

QObject::connect(myClassPointer,SIGNAL(strReplyReay(QString)) , 
       myWidgetPointer,SLOT(readReply(QString)));