Qt如何获取一个无限循环程序的不断更新的标准输出?

qq_24916961 2015-01-05 12:34:34
比如说我现在要后台运行一个打印网络连接的程序(这个程序是要不断打印网络连接情况的),我现在要不断获取其更新的标准输出,然后把这些变化的标准输出打印到我的一个显示控件里面,求解,到底如何才能实现这一个功能?
...全文
858 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
大卫无限 2015-01-12
  • 打赏
  • 举报
回复
QTimer刷新是不行的.因为如果没有标准输出,你去读取标准输出,也是读取不到的.如果有了标准输出,那么就它会发信号告诉你. 还有你得确定你的测试程序是用的标准输出.提示device not open,是因为你的进程没有启动起来吧. 怎么会这么乱呢.你确定你代码,你搞清楚了?
qq_24916961 2015-01-11
  • 打赏
  • 举报
回复
求大神啊......
qq_24916961 2015-01-11
  • 打赏
  • 举报
回复
引用 11 楼 n7zj0x8 的回复:

m_iQProcess.start(qApp->arguments().first(), QStringList());
这里是启动程序自身的意思..这里用一个程序模拟了你提到的两个程序. 你说的循环获取标准输出,就是这代码了.

connect(&m_iQProcess, SIGNAL(readyReadStandardOutput()),
            this, SLOT(ReadOutput()));
m_iQProcess启动了程序x.那么x一有标准输出,m_iQProcess就会发出信号readyReadStandardOutput(),信号和槽绑定了, 所以一有标准输出,函数ReadOutput()就会被调用.在ReadOutput()内就可以获取标准输出信息.
尝试使用QTimer 刷新机制 ,结果运行得到这个报警 QIODevice::read: device not open
qq_24916961 2015-01-11
  • 打赏
  • 举报
回复
引用 11 楼 n7zj0x8 的回复:

m_iQProcess.start(qApp->arguments().first(), QStringList());
这里是启动程序自身的意思..这里用一个程序模拟了你提到的两个程序. 你说的循环获取标准输出,就是这代码了.

connect(&m_iQProcess, SIGNAL(readyReadStandardOutput()),
            this, SLOT(ReadOutput()));
m_iQProcess启动了程序x.那么x一有标准输出,m_iQProcess就会发出信号readyReadStandardOutput(),信号和槽绑定了, 所以一有标准输出,函数ReadOutput()就会被调用.在ReadOutput()内就可以获取标准输出信息.
不行啊 几乎照搬了你的代码 试了好几次都不行,很简单的每隔一秒打印hello的程序 我连信号都无法收到
Jonix 2015-01-05
  • 打赏
  • 举报
回复
用线程打印,用发信号的方式把要打印的东西传出来就可以了。
qq_24916961 2015-01-05
  • 打赏
  • 举报
回复
跪求大神!!!!!
大卫无限 2015-01-05
  • 打赏
  • 举报
回复

m_iQProcess.start(qApp->arguments().first(), QStringList());
这里是启动程序自身的意思..这里用一个程序模拟了你提到的两个程序. 你说的循环获取标准输出,就是这代码了.

connect(&m_iQProcess, SIGNAL(readyReadStandardOutput()),
            this, SLOT(ReadOutput()));
m_iQProcess启动了程序x.那么x一有标准输出,m_iQProcess就会发出信号readyReadStandardOutput(),信号和槽绑定了, 所以一有标准输出,函数ReadOutput()就会被调用.在ReadOutput()内就可以获取标准输出信息.
qq_24916961 2015-01-05
  • 打赏
  • 举报
回复
引用 9 楼 n7zj0x8 的回复:
widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QApplication>
#include <QLineEdit>
#include <QDebug>
#include <stdio.h>
#include <iostream>
#include <QMessageBox>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget),
    m_iQProcess()
{
    ui->setupUi(this);
    connect(&m_iQProcess, SIGNAL(readyReadStandardOutput()),
            this, SLOT(ReadOutput()));
}

Widget::~Widget()
{
    delete ui;
}

void Widget::ReadOutput()
{
    QByteArray ba = m_iQProcess.readAllStandardOutput();
    qDebug() << ba;
    QMessageBox::information(this, "", ba);
}

void Widget::on_pushButton_clicked()
{
    m_iQProcess.start(qApp->arguments().first(), QStringList());
}

void Widget::on_pushButton_2_clicked()
{
    printf("ddddddd");
    std::cout << "aaa";
    fflush(stdout);
}
widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QProcess>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

public slots:
    void ReadOutput();

private slots:
    void on_pushButton_clicked();
    void on_pushButton_2_clicked();

private:
    Ui::Widget *ui;
    QProcess m_iQProcess;
};

#endif // WIDGET_H

界面上面的两个按钮,先点第一个按钮启动一个程序(b). 再点(b)的第二个按钮输出,第一个程序就可以收到了..
void Widget::on_pushButton_clicked() { m_iQProcess.start(qApp->arguments().first(), QStringList()); } 这一段没看懂,还有想问一下这个代码里面循环更新标准输出的机制在那?
大卫无限 2015-01-05
  • 打赏
  • 举报
回复
widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QApplication>
#include <QLineEdit>
#include <QDebug>
#include <stdio.h>
#include <iostream>
#include <QMessageBox>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget),
    m_iQProcess()
{
    ui->setupUi(this);
    connect(&m_iQProcess, SIGNAL(readyReadStandardOutput()),
            this, SLOT(ReadOutput()));
}

Widget::~Widget()
{
    delete ui;
}

void Widget::ReadOutput()
{
    QByteArray ba = m_iQProcess.readAllStandardOutput();
    qDebug() << ba;
    QMessageBox::information(this, "", ba);
}

void Widget::on_pushButton_clicked()
{
    m_iQProcess.start(qApp->arguments().first(), QStringList());
}

void Widget::on_pushButton_2_clicked()
{
    printf("ddddddd");
    std::cout << "aaa";
    fflush(stdout);
}
widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QProcess>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

public slots:
    void ReadOutput();

private slots:
    void on_pushButton_clicked();
    void on_pushButton_2_clicked();

private:
    Ui::Widget *ui;
    QProcess m_iQProcess;
};

#endif // WIDGET_H

界面上面的两个按钮,先点第一个按钮启动一个程序(b). 再点(b)的第二个按钮输出,第一个程序就可以收到了..
大卫无限 2015-01-05
  • 打赏
  • 举报
回复
引用 7 楼 n7zj0x8 的回复:
如果这个程序是你主动启动的.那么可以这样. 程序一用QProcess启动后台运行程序.在QProcess的信号readyReadStandardOutput (),的时候,读取标准输出.并通过QLocalServer开启一个监听.把信息发送给连接进来的QLocalSocket. 程序二使用QLocalSocket去连接程序一的QLocalServer,进行通信.
我发现有点多此一举了..如果是这种情况一个程序就可以了..晕.不用使用QLocalSocket.
大卫无限 2015-01-05
  • 打赏
  • 举报
回复
如果这个程序是你主动启动的.那么可以这样. 程序一用QProcess启动后台运行程序.在QProcess的信号readyReadStandardOutput (),的时候,读取标准输出.并通过QLocalServer开启一个监听.把信息发送给连接进来的QLocalSocket. 程序二使用QLocalSocket去连接程序一的QLocalServer,进行通信. 如果这个后台运行的程序并不是你的启动的.那就需要使用windows的函数openprocess把这个进程打开.然后安装钩子setwindowshookex,在钩子里面通过QLocalSocket发送消息出来.这个安装钩子,要钩住什么函数,这个我也不清楚,只有问度娘了.说不定需要用到内联钩子..
qq_24916961 2015-01-05
  • 打赏
  • 举报
回复
真心不是自己懒,昨天中午搞到现在了,没搞出来,能不能来个详细点的大神。。。。
qq_24916961 2015-01-05
  • 打赏
  • 举报
回复
引用 4 楼 Inhibitory 的回复:
Non-GUI QObject subclasses such as QTimer, QProcess, and the network classes are reentrant. We can use them in any thread, as long as the thread has an event loop. For secondary threads, the event loop is started by calling QThread::exec() or by convenience functions such as QProcess::waitForFinished() and QAbstractSocket::waitForDisconnected(). Because of limitations inherited from the low-level libraries on which Qt's GUI support is built, QWidget and its subclasses are not reentrant. One consequence of this is that we cannot directly call functions on a widget from a secondary thread. If we want to, say, change the text of a QLabel from a secondary thread, we can emit a signal connected to QLabel::setText() or call QMetaObject::invokeMethod() from that thread. For example: void MyThread::run() { ... QMetaObject::invokeMethod(label, SLOT(setText(const QString &)), Q_ARG(QString, "Hello")); ... }
额 没怎么看懂啊?
Inhibitory 2015-01-05
  • 打赏
  • 举报
回复
Non-GUI QObject subclasses such as QTimer, QProcess, and the network classes are reentrant. We can use them in any thread, as long as the thread has an event loop. For secondary threads, the event loop is started by calling QThread::exec() or by convenience functions such as QProcess::waitForFinished() and QAbstractSocket::waitForDisconnected(). Because of limitations inherited from the low-level libraries on which Qt's GUI support is built, QWidget and its subclasses are not reentrant. One consequence of this is that we cannot directly call functions on a widget from a secondary thread. If we want to, say, change the text of a QLabel from a secondary thread, we can emit a signal connected to QLabel::setText() or call QMetaObject::invokeMethod() from that thread. For example: void MyThread::run() { ... QMetaObject::invokeMethod(label, SLOT(setText(const QString &)), Q_ARG(QString, "Hello")); ... }
qq_24916961 2015-01-05
  • 打赏
  • 举报
回复
引用 2 楼 Jonix 的回复:
用线程打印,用发信号的方式把要打印的东西传出来就可以了。
要开2个线程吧,一个后台运行程序,一个获取标准输出,是吗? 还有readAllStandardOutput();可以在进程运行的时候同时读取吗?

16,802

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧