Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从文件(由另一个作业更新)在Qdialog中动态更新QTextBrowser_C++_Qt_Qt5_Qtextbrowser - Fatal编程技术网

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

C++ 从文件(由另一个作业更新)在Qdialog中动态更新QTextBrowser,c++,qt,qt5,qtextbrowser,C++,Qt,Qt5,Qtextbrowser,我有一个在作业运行时更新的日志文件。我希望文本内容显示在文本浏览器中,并且应该动态更新 .h文件 public: void fillloginfo(); void initializeQTimer(); void closeEvent(QCloseEvent *event); void fillLogInfoChronically(const QString& logFilePath); private: QTimer* m_Timer

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

.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();
}
因此,我只能在第一次调用时读取该文件,其余从该文件获取更新的调用都不起作用


提前感谢

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

在您的情况下,您必须在再次阅读之前执行以下操作:

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

完整的代码如下所示

日志多久写入一次?我无法控制生成的日志。我从我的工具启动了一个作业,并更新了日志文件。那么,您确定日志已更新吗?因为
getline
正在阻塞,您可以无限期地等待。是的,我确信日志正在更新,我在第一个iter中编写的代码块正在读取文件,但在信号槽机制的连续调用中,什么也没做。