从 C++ 中的 gui 内创建的对象修改 GUI

Posted

技术标签:

【中文标题】从 C++ 中的 gui 内创建的对象修改 GUI【英文标题】:Modify GUI from object created inside the gui in c++ 【发布时间】:2016-09-19 08:22:44 【问题描述】:

我想问一下如何在屏幕上添加一些文字。 我有按钮,当我点击它时,我创建了新对象。它具有为我提供一些数据的功能。 如何从 gui 访问该数据?我不能有吸气剂,因为它会在一段时间后(连接到服务器后)给我数据。 是否可以在 gui 类中创建的对象内将文本放入 textEdit?

谢谢

我添加了代码,解释了一点,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;

这里我想更改 ui 的东西。


【问题讨论】:

你能说得更准确点吗?我无法帮助您,因为我没有有价值的信息可以帮助您。从 GUI 访问数据?你什么意思 ?能否请您也提供一些代码? 【参考方案1】:

是的,这是可能的。但目前你的问题对我来说似乎太宽泛或不清楚[至少]。我假设您将 Qt Creator 与它的设计器一起使用。所以你应该能够访问一个ui 对象(在你的MainWindow 类中)。有了这个对象,您就可以随时随地更改 UI。

因此,首先为该文本框(即QLineEdit)分配一个ID(例如myLineEdit)。现在,ui-&gt;myLineEdit 为您提供了一个 QLineEdit *,它实际上是对该文本框的引用。所以无论你想更新 UI,你都应该有那个参考。例如,如果您使用 TCP 套接字编程来联系远程服务,则在 QTcpSocketonReadyRead 信号中,您可以使用刚刚收到的数据更新文本框:

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

【讨论】:

【参考方案2】:

我用 getter 和 setter 以及另一个按钮解决了这个问题

第一个按钮: 开始监听...创建 EchoClient 对象,这将打开 websocket,连接到 websocket 服务器。如果消息从服务器到达,它会转到名为 onTextMessageRecieved 的 EchoClient 类中的方法,在那里它将属性消息设置为传入消息的值。

void EchoClient::onTextMessageReceived(QString message)

    if (!m_debug)
        qDebug() << "Message received:" << message;

    setData(message); //setting atribute message

第二个按钮: 获取数据...这将调用 EchoClient 类的 get 方法。交流是我的 gui 课。

void Comunication::on_getData_clicked()

    ui->textEdit_2->setText(this->client->getData());

但是这个解决方案还不够好,你能否请教如何让它一旦有新消息我的 textEdit 就会自动更新? 我应该在另一个线程中做吗?我没有太多经验。

谢谢。

【讨论】:

而不是setData() 发出带有消息的信号。如果 Communication 类也无法访问 UI,那么只需在此处添加相同的信号并使其转发来自 EchoClient 的信号(信号/信号连接)。在某个地方,您将可以访问 UI 元素和“数据源”,然后您可以将信号连接到 UI 插槽,例如QTextEdit::append() 通讯是 gui 类,我怎样才能发出带有消息的信号?我不知道如何把这两个放在一起。

以上是关于从 C++ 中的 gui 内创建的对象修改 GUI的主要内容,如果未能解决你的问题,请参考以下文章

C++ GUI 中的拖放事件 (WM_DROPFILES)

是否可以将模型对象的插槽连接到 QT4 -Designer 中的 GUI?

GUI

C++ 中的 GUI 工具包出现问题。将 lambda 传递到 std::function 的向量中

处理 GUI 应用程序中的复杂规则(C++ 或 C#)

当从外部对象调用方法时,qt 的 gui 线程是不是会在后台生成线程?