从文件中动态更新 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(由另一个作业更新)的主要内容,如果未能解决你的问题,请参考以下文章
关闭 QDialog 窗口是不是会删除其动态添加的 UI 元素?
qt5:如何从 qthread 中的静态函数创建和显示自定义 qdialog