2016-09-19 62 views
0

我想問一下如何在屏幕上添加一些文本。 我有按鈕,當我點擊它時,我創建了一個新的對象。它具有爲我提供一些數據的功能。 如何從gui訪問該數據?我不能有一個getter,因爲它在一段時間後(連接到服務器後)給我提供數據。 是否有可能將文本放入gui類中創建的對象內的textEdit?從在GUI中創建的對象修改GUI

感謝

我添加代碼,解釋試圖幫助多一點,SRY的混亂,THX:

我有GUI類的內部創建EchoClient對象:

void Comunication::startListening(){ 

    if (this->client == NULL) 
     { 
      this->client = new EchoClient(QUrl(QStringLiteral("ws://localhost:1234")), 0); 
      QObject::connect(client, &EchoClient::closed, this, &QApplication::quit); 

    } 
     else 
      qWarning() << "Carefull, the client is already running"; 
    } 

然後在我的EchoClient我有功能

void EchoClient::onTextMessageReceived(QString message) 
{ 
    if (!m_debug) 
     qDebug() << "Message received:" << message; 

這裏我想改變用戶界面的東西。

} 
+0

你能更精確嗎?我無法幫助你,因爲我沒有有價值的信息。 從GUI訪問數據?你什麼意思 ? 你能提供一些代碼嗎? – MadJlzz

回答

0

我解決了這個問題,一個getter和setter和另一個按鈕

第一個按鈕:開始偵聽...創建EchoClient對象,這將打開websocket,連接到websocket服務器。如果消息已經從服務器到達,它將從EchoClient類調用onTextMessageRecieved方法,在那裏它設置屬性消息爲傳入消息的值。

void EchoClient::onTextMessageReceived(QString message) 
{ 
    if (!m_debug) 
     qDebug() << "Message received:" << message; 

    setData(message); //setting atribute message 
} 

第二個按鈕:獲取數據......這將調用來自EchoClient類get方法。通信是我的貴班。

void Comunication::on_getData_clicked() 
{ 
    ui->textEdit_2->setText(this->client->getData()); 
} 

但是這種解決方案不夠好,可以喲請指教如何儘快使其作爲有新的消息,我的文字編輯將全自動更新? 我應該在另一個線程中執行它嗎?我沒有太多經驗。

謝謝。

+1

而不是'setData()'用消息發出一個信號。 如果'Communication'類無法訪問UI,則只需在其中添加相同的信號並使其從'EchoClient'(信號/信號連接)轉發。 在某個地方,您將訪問UI元素和「數據源」,然後您可以將信號連接到UI插槽,例如, 'QTextEdit :: append()' –

+0

通信是gui類,我怎樣才能發出帶有消息的信號?我不知道如何把這兩個放在一起。 –

+0

好吧,我知道了,我使用了信號插槽。謝謝 –

0

是的,這是可能的。但是,目前你的問題似乎過於寬泛或不明確[至少]對我來說。我假設你正在使用Qt Creator和它的設計器。所以你應該可以訪問一個ui對象(在你的MainWindow類中)。掌握這個對象後,您可以隨時隨地更改UI。

因此,首先分配該文本框(即QLineEdit)的ID(例如myLineEdit)。現在,ui->myLineEdit爲您提供了一個QLineEdit *,它實際上是對該文本框的引用。所以,無論你想更新UI,你都應該有這個參考。因爲如果你使用TCP套接字編程用於接觸遠程服務,在QTcpSocketonReadyRead信號例如,您可以更新數據,你剛剛收到的文本框:

QLineEdit *textbox = ui->myLineEdit; 
textbox->setText("updated data");