qt子线程写文件 报错device not open
时间: 2023-08-11 18:03:16 浏览: 213
在 Qt 中,子线程写文件需要注意一些问题。
首先,子线程不能直接访问 GUI 线程中的 UI 控件,因为 UI 控件只能在主线程中被访问。因此,在子线程中进行文件操作时,应该使用信号与槽机制将文件操作的结果传递给主线程,在主线程中进行 UI 更新。
其次,如果在子线程中打开了文件,需要在子线程中进行文件的写入操作。如果在主线程中打开了文件,那么在子线程中进行文件的写入操作时,可能会出现 “device not open” 的错误。
下面是一个在子线程中写文件的示例代码:
```cpp
// MyWorkerThread.h
#include <QThread>
#include <QFile>
class MyWorkerThread : public QThread
{
Q_OBJECT
public:
MyWorkerThread(QObject *parent = nullptr);
~MyWorkerThread();
void run() override;
signals:
void finished();
void error(QString err);
private:
QFile m_file;
};
// MyWorkerThread.cpp
#include "MyWorkerThread.h"
MyWorkerThread::MyWorkerThread(QObject *parent)
: QThread(parent)
{
m_file.setFileName("test.txt");
}
MyWorkerThread::~MyWorkerThread()
{
if (m_file.isOpen()) {
m_file.close();
}
}
void MyWorkerThread::run()
{
if (!m_file.open(QIODevice::WriteOnly)) {
emit error("Failed to open file.");
return;
}
QTextStream out(&m_file);
out << "Hello, World!" << endl;
m_file.flush();
m_file.close();
emit finished();
}
```
在上面的示例代码中,我们在子线程中创建了一个 QFile 对象,然后在 run() 函数中打开了这个文件,写入了一些数据,并在结束时关闭了文件。我们还定义了两个信号:finished() 和 error(),分别用于通知主线程操作完成和发生错误。
当然,你需要在主线程中创建一个 MyWorkerThread 对象,并将它的 finished() 和 error() 信号连接到相应的槽函数上。另外,在启动线程之前,你需要调用 moveToThread() 函数将 MyWorkerThread 对象移到子线程中。
阅读全文