2016-09-19 59 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");