QIODevice 类学习笔记

本文详细介绍了Qt中的QIODevice类,包括设备类型、打开模式、构造与析构方法、读写操作及控制等内容,并提供了关键函数的说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

QIODevice 类学习笔记

Isaaccwoo 2015年12月10日

一、       简介

QIODevice用于对输入输出设备进行管理。输入设备有两种类型,一种是随机访问设备(Random-accessdevices),如文件、缓冲区等;另一种是时序设备(Sequential device),如网络、进程等。可以通过isSequential()函数分辨设备是哪种类型的。

二、       自定义类型

设备的打开方式:OpenMode

enum QIODevice::OpenModeFlag

flags QIODevice::OpenMode

Constant

Value

Description

QIODevice::NotOpen

0x0000

The device is not open.

QIODevice::ReadOnly

0x0001

The device is open for reading.

QIODevice::WriteOnly

0x0002

The device is open for writing. Note that this mode implies Truncate.

QIODevice::ReadWrite

ReadOnly | WriteOnly

The device is open for reading and writing.

QIODevice::Append

0x0004

The device is opened in append mode so that all data is written to the end of the file.

QIODevice::Truncate

0x0008

If possible, the device is truncated before it is opened. All earlier contents of the device are lost.

QIODevice::Text

0x0010

When reading, the end-of-line terminators are translated to '\n'. When writing, the end-of-line terminators are translated to the local encoding, for example '\r\n' for Win32.

QIODevice::Unbuffered

0x0020

Any buffer in the device is bypassed.

 

 

三、       正确的打开方式  输入输出设备的使用方法

1.            构造与析构

函数

说明

QIODevice()

 

QIODevice(QObject * parent)

 

~QIODevice()

继承类需自行保证close()

 

2.            OpenMode

返回类型

函数

说明

OpenMode

openMode() const

QIODevice::OpenMode

void [protected]

setOpenMode(OpenMode openMode)

 

bool

isOpen() const

QIODevice::NotOpen

bool

isReadable() const

QIODevice::ReadOnly

bool

isWritable() const

QIODevice::WriteOnly

bool

isTextModeEnabled() const

QIODevice::Text

void

setTextModeEnabled(bool enabled)

QIODevice::Text

bool [virtual]

isSequential() const

 

 

3.            打开关闭设备

返回类型

函数

说明

bool [virtual]

open(OpenMode mode)

 

bool

isOpen() const

 

void [virtual]

close()

 

void [signal]

aboutToClose()

 

Bool [virtual]

reset()

重打开设备。

不适用于QIODevice::Text类设备。

 

4.            数据读写操作及控制

输入函数

返回类型

函数

说明

bool [virtual]

waitForReadyRead(int msecs)

等待可读

void [signal]

readyRead()

中断式可读

qint64 [virtual]

bytesAvailable() const

查询式可读

qint64 [protected]

[pure virtual]

readData(char * data, qint64 maxSize)

需要在继承类重实现的

读函数

qint64

read(char * data, qint64 maxSize)

QByteArray

read(qint64 maxSize)

.

qint64

peek(char * data, qint64 maxSize)

“偷看”

QByteArray

peek(qint64 maxSize)

.

QByteArray

readAll()

读全部

bool [virtual]

canReadLine() const

可读行

qint64 [virtual] [protected]

readLineData(char * data, qint64 maxSize)

可以在继承类重实现的

读行函数

qint64

readLine(char * data, qint64 maxSize)

读行

(maxSize包括行结束字符)

QByteArray

readLine(qint64 maxSize = 0)

读行

bool

getChar(char * c)

读char

void

ungetChar(char c)

undo char

void [signal]

readChannelFinished()

输入通道结束。

但此时可能仍有数据可读。

输出函数

返回类型

函数

说明

bool [virtual]

waitForBytesWritten(int msecs)

等待已写

void [signal]

bytesWritten(qint64 bytes)

中断式已写

qint64 [virtual]

bytesToWrite() const

查询式写完

qint64 [protected]

[pure virtual]

writeData(const char * data,

qint64 maxSize)

需要在继承类重实现的

写函数

qint64

write(const char * data, qint64 maxSize)

qint64

write(const char * data)

.

qint64

write(const QByteArray & byteArray)

.

bool

putChar(char c)

写char

isSequential()不同有区别的函数

返回类型

函数

说明

qint64 [virtual]

pos() const

 

bool [virtual]

seek(qint64 pos)

 

qint64 [virtual]

size() const

随机访问设备为区域大小,时序设备为bytesAvailable()

其他函数

返回类型

函数

说明

bool [virtual]

atEnd() const

 

QString

errorString() const

 

void [protected]

setErrorString(const QString & str)

 

注:qint64返回值一般原则为,错误返回-1,成功返回>=0


<think>好的,我现在需要回答用户关于QIODevice是否线程安全的问题。首先,我应该回忆一下Qt框架中关于线程安全的基本知识。Qt中的许多并不是线程安全的,但有些可以在多线程环境下使用,只要遵循一定的规则。 用户提到了QIODevice,它是所有I/O设备的基,比如QFile、QTcpSocket、QSerialPort等。我需要确认QIODevice本身的线程安全性。根据Qt的文档,大多数QIODevice的子都不是线程安全的,只能在创建它们的线程中使用。例如,不能在另一个线程中直接调用在主线程创建的QIODevice对象的方法,否则可能导致错误,如用户提到的跨线程调用报错[^4]。 接下来,用户提供的引用[1]和[4]都提到了跨线程调用QIODevice派生(如QSerialPort、QTcpSocket)的问题,解决方案通常涉及信号槽机制,因为Qt的信号槽是线程安全的,能够跨线程传递消息。因此,正确的做法是将I/O操作限制在对象所属的线程,并通过信号槽与其他线程通信。 另外,引用[2]指出所有I/O都继承自QIODevice,而引用[3]提到了QIODevice::readyRead()信号,这可能与异步通知相关。这些信号可以在不同线程中安全使用,但直接调用方法仍需注意线程归属。 总结起来,QIODevice本身不是线程安全的,必须通过正确的线程间通信机制来操作。需要强调使用时必须遵循每个对象只能在其所属线程访问的原则,否则会导致运行时错误。同时,可以建议使用事件循环和信号槽来安全地跨线程操作。</think>### QIODevice的线程安全性分析 在Qt框架中,**QIODevice本身不是线程安全的**,但其设计允许通过特定方式实现跨线程操作。以下是关键点分析: 1. **线程归属规则** - QIODevice派生(如QTcpSocket、QSerialPort)必须在其创建的线程中使用。若跨线程直接调用方法,会触发错误提示: `QObject: Cannot create children for a parent that is in a different thread`[^4] 这表明Qt对象与其子对象需保持在同一线程。 2. **线程安全操作方式** - **信号槽机制**:可通过信号槽跨线程传递数据。例如,在子线程中读取到数据后,通过信号发送到主线程处理[^1][^3]: ```cpp // 子线程中 connect(socket, &QTcpSocket::readyRead, this, &Worker::handleData); ``` - **事件循环**:通过`QMetaObject::invokeMethod`或`moveToThread()`方法切换对象所属线程[^1]。 3. **异步操作的例外** - 部分QIODevice派生(如`QNetworkReply`)支持异步操作,其`readyRead()`信号可跨线程触发,但具体读写仍需在对象所属线程完成。 --- ### 跨线程操作建议步骤 1. **对象创建**:在专属线程中创建QIODevice对象(如串口、网络套接字) 2. **信号连接**:通过信号槽将数据就绪事件传递到其他线程 3. **数据传递**:使用线程安全容器(如`QMutex`保护的队列)传递原始数据 4. **资源释放**:通过`deleteLater()`确保对象在所属线程销毁 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值