【问题标题】:Get data from Data reader terminal to GUI (QtCreator)从数据阅读器终端获取数据到 GUI (QtCreator)
【发布时间】:2016-10-13 15:28:03
【问题描述】:

我需要一个小 GUI,显示来自下方数据读取器的数据。假设我在控制台中的数据阅读器显示了 10 条消息,我只需要在 GUI 中显示第一条消息半秒,第二条消息以此类推......在 QtCreator 的 Textbrowser 中。

感谢任何帮助。

DDS_DomainParticipant_get_current_time (participant, &ts1);

status = Chat_ChatMessageDataReader_take(
    chatAdmin,
    msgSeq,
    infoSeq,
    DDS_LENGTH_UNLIMITED,
    DDS_ANY_SAMPLE_STATE,
    DDS_ANY_VIEW_STATE,
    DDS_ALIVE_INSTANCE_STATE );

checkStatus(status, "Chat_NamedMessageDataReader_take");

for (i = 0; i < msgSeq->_length; i++) 
{
    DDS_DomainParticipant_get_current_time (participant, &ts2);
    Chat_ChatMessage *msg = &(msgSeq->_buffer[i]);
    printf ("%d: %s t1.secs %d t1.ns %u t2.secs %d t2.ns %u \n", msg->userID, msg->content, ts1.sec, ts1.nanosec,ts2.sec, ts2.nanosec);
    fflush(stdout);
}

输出: 留言板已打开:发送一条用户 ID = -1 的 ChatMessage 以将其关闭....

    1: Hi there, I will send you 20 more messages. t1.secs 1465476565 t1.ns 676311347 t2.secs 1465476565 t2.ns 676395551 
    1: 1 t1.secs 1465476566 t1.ns 676569175 t2.secs 1465476566 t2.ns 676596400 
    1: 2 t1.secs 1465476567 t1.ns 677616392 t2.secs 1465476567 t2.ns 677648204 
    1: 3 t1.secs 1465476568 t1.ns 678910684 t2.secs 1465476568 t2.ns 678940815 
    1: 4 t1.secs 1465476569 t1.ns 680225024 t2.secs 1465476569 t2.ns 680255376 
    1: 5 t1.secs 1465476570 t1.ns 681507684 t2.secs 1465476570 t2.ns 681534887 
    1: 6 t1.secs 1465476571 t1.ns 682657681 t2.secs 1465476571 t2.ns 682689735 
    1: 7 t1.secs 1465476572 t1.ns 683901346 t2.secs 1465476572 t2.ns 683931532 
    1: 8 t1.secs 1465476573 t1.ns 684895076 t2.secs 1465476573 t2.ns 684926328 
    1: 9 t1.secs 1465476574 t1.ns 686201827 t2.secs 1465476574 t2.ns 686231445 
    1: 10 t1.secs 1465476575 t1.ns 687286401 t2.secs 1465476575 t2.ns 687318820 
    1: 11 t1.secs 1465476576 t1.ns 687569194 t2.secs 1465476576 t2.ns 687602357 
    1: 12 t1.secs 1465476577 t1.ns 688870441 t2.secs 1465476577 t2.ns 688900707 
    1: 13 t1.secs 1465476578 t1.ns 690184430 t2.secs 1465476578 t2.ns 690213984 
    1: 14 t1.secs 1465476579 t1.ns 691483124 t2.secs 1465476579 t2.ns 691517976 
    1: 15 t1.secs 1465476580 t1.ns 692274389 t2.secs 1465476580 t2.ns 692299778 
    1: 16 t1.secs 1465476581 t1.ns 693601908 t2.secs 1465476581 t2.ns 693667232 
    1: 17 t1.secs 1465476582 t1.ns 694371847 t2.secs 1465476582 t2.ns 694395932 
    1: 18 t1.secs 1465476583 t1.ns 695229750 t2.secs 1465476583 t2.ns 695421352 
    1: 19 t1.secs 1465476584 t1.ns 696229812 t2.secs 1465476584 t2.ns 696261942 
    1: 20 t1.secs 1465476585 t1.ns 696390252 t2.secs 1465476585 t2.ns 696417861 

我尝试从文本文件中访问数据,这实际上不再是实时的。我现在想实时访问数据(即直接从终端到 GUI)。

来自文本文件:

void MainWindow::on_pushButton_clicked()
{
    QFile file("/home/akhil/test.txt");
    if(!file.open(QIODevice::ReadOnly))
        QMessageBox::information(0,"info",file.errorString());

    QTextStream in(&file);
    ui->textBrowser->setText(in.readAll());

}

【问题讨论】:

  • 我不是很清楚你的要求。你真的需要图形用户界面吗?您提到 qtcreator 中的文本浏览器,您是在谈论输出控制台(stdout)吗?否则我假设你只想打印出每条消息,它们之间有 0.5 秒的延迟(即你可以使用 'QThread::msleep(500);' 作为粗略的修复,或者你可以使用 QTimer (更好的解决方案)......你能澄清一下你想要什么给我吗?谢谢
  • @code_fodder 我的意思是 QtCreator 中的用户界面有小部件,我们有这个文本浏览器。所以我想将这个数据阅读器输出(我在 linux 的控制台中得到)显示到这个 qtcreator textbrowser 小部件。我以前从未使用 Qt 做过 GUI,如果我的解释不太清楚,请原谅
  • 嗯,好的,知道了 - 使用 QTextBrowser!

标签: c++ linux qt user-interface data-distribution-service


【解决方案1】:

粗鲁的方式

好的,这是一种非常粗略的方式来做你想做的事 - 对于快速测试很有用:

void MainWindow::on_pushButton_clicked()
{
    QFile file("/home/akhil/test.txt");
    if(!file.open(QIODevice::ReadOnly))
        QMessageBox::information(0,"info",file.errorString());

    QTextStream in(&file);
    while (!in.atEnd())
    {
        ui->textBrowser->setText(in.readLine()); // read one line and display it
        QThread::msleep(500); // Pause for 500ms: #include <QThread>
    }
}

正确的方法

但是更好的方法是将 QTextStream 作为成员对象打开,然后您可以使用 QTimer:

创建计时器并连接它:

QTimer *m_timer = new QTimer(this);
connect(m_timer &QTimer::timeout(), this, &MainWindow::onTimer());

启动计时器(可能在您的on_pushButton_clicked() 函数中):

m_timer.start(500);

在定时器槽上:

MainWindow::onTimer()
{
    ui->textBrowser->setText(m_in.readLine()); // read one line and (in is now member variable 'm_in'
    if (m_in.atEnd())
    {
        m_timer.stop(); // stop the timer we have reached the end.
        // Close the io stream etc...
    }
}

【讨论】:

  • 我想实时访问数据,即尽管将数据打印到文本文件然后显示它,但我想直接将数据获取到文本编辑中。不再来自文本文件。 @code_fodder
  • @AkhilChandraMaganti 我不太确定我是否理解你。您的数据来自文件,对吗?你想在你的文本编辑中显示这个吗?此行将数据显示到您的文本编辑中:ui-&gt;textBrowser-&gt;setText(m_in.readLine());,我不太明白您的意思...
  • 如果您阅读我的描述,我提到我想要实时数据。如果我从文本文件中获取数据,它就不再是实时的了。我上面提到的是,我尝试使用文本文件并且效果很好。现在我想直接使用,即以前,我曾经将数据输入我的 linux 终端,现在我希望将这些数据显示到 textEdit/Label/任何其他 UI 中。如果我还不清楚,请原谅,但我很清楚。在 DDS 的上下文中,我希望您能够(从我的标签)理解我从远程终端接收数据。如果不是没有问题,没关系abvcode
  • @AkhilChandraMaganti 所以你想等待收到的消息,然后在它们到达时将它们打印到屏幕上? DDS 消息到达时是否发生事件?还是您必须继续轮询状态?您可以做的是,每当消息到达时,都会向“编写器”对象发出信号。 writer 对象将负责在消息进入时编写消息 - 将您的读取代码与您的写入代码分离。
  • @AkhilChandraMaganti 理想情况下,您的读者将与您的作者处于不同的线程中;特别是如果它必须轮询。如果您可以提供有关如何检测传入数据的更多详细信息,我可以提供一个示例。随时将此添加到您的问题中......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多