从文件中动态更新 Qdialog 中的 QTextBrowser(由另一个作业更新)

Posted

技术标签:

【中文标题】从文件中动态更新 Qdialog 中的 QTextBrowser(由另一个作业更新)【英文标题】:Dynamic update of QTextBrowser in a Qdialog from a file(that gets updated by another job) 【发布时间】:2017-09-06 06:37:24 【问题描述】:

我有一个在作业运行时更新的日志文件。我希望在文本浏览器中显示文本内容,并且应该动态更新。

.h 文件

public:

    void fillloginfo();

    void initializeQTimer();

    void closeEvent(QCloseEvent *event);

    void fillLogInfoChronically(const QString& logFilePath);

private:

    QTimer* m_Timer;

    QString m_logFilePath;

    std::ifstream m_logFileStream;

public slots:

    void fillLogInfoChronicallySlot();

.cpp 文件

void logdialog::initializeQTimer()

    m_Timer = NULL;

    //create the timer object
    m_Timer = new QTimer(this);

    QObject::connect(m_Timer,SIGNAL(timeout()), this,SLOT(fillLogInfoChronicallySlot()));

 

void logdialog::closeEvent(QCloseEvent *event)

    m_Timer->stop();

    if ( m_logFileStream.is_open())
         m_logFileStream.close();
    




void logdialog::fillLogInfoChronically(const QString &logFilePath)

    uilog->textBrowser->clear();

    m_LastLinePos = 0;

    m_logFilePath = logFilePath;

    std::string m_logFilePathStr= m_logFilePath.toStdString();
    m_logFileStream.open(m_logFilePathStr.c_str());

    if (m_logFileStream.is_open())

        fillloginfo();

        m_Timer->start(1000);
    


void logdialog::fillloginfo()

    std::string line;
    while (getline(m_logFileStream,line))
        uilog->textBrowser->append(QString::fromStdString(line));
      


void logdialog::fillLogInfoChronicallySlot()

    fillloginfo();

所以,我只能在第一次调用时读取文件,其余从文件中获取更新的调用都不起作用。

提前致谢

【问题讨论】:

多久写入一次日志? 我无法控制生成的日志。我从我的工具启动了一项工作,并更新了日志文件。 那么,你确定日志更新了吗?因为getline 处于阻塞状态,您可以无限期等待。 是的,我确定日志正在更新,我在第一个迭代中编写的代码块正在读取文件,但在信号槽机制的连续调用中什么也没做。 【参考方案1】:

初始读取后需要在输入流中调用std::ios::clear()。当您读取整个文件时,它会在流中设置failbit 并拒绝继续读取,即使在此期间文件已更改。

在你的情况下,你必须在再次阅读之前做:

void logdialog::fillloginfo()

    std::string line;
    m_logFileStream.clear();
    while (getline(m_logFileStream,line))
        uilog->textBrowser->append(QString::fromStdString(line));
    

完整代码在下面link

【讨论】:

以上是关于从文件中动态更新 Qdialog 中的 QTextBrowser(由另一个作业更新)的主要内容,如果未能解决你的问题,请参考以下文章

使用 QText 浏览器打开桌面

关闭 QDialog 窗口是不是会删除其动态添加的 UI 元素?

如何从 Python 中的 QDialog 实例返回值?

qt5:如何从 qthread 中的静态函数创建和显示自定义 qdialog

如何从另一个 QDialog 访问组合框的文本并将其写入该对话框中的 lineEdit

CAD命令qtext怎么用?