一,QT对象new完了谁负责删除 1,如果全是ui组件,并且指定了父组件,那么 main window 的 new UI和 delete UI 将会自动析构UI树,如果手动删除控件,也会从父组件的队列删除子指针 2,QT类需要在各个类之间发送消息,则class内部必须声明Q_OBJECT并且继承QObject,才可以使用信号槽。信号和操依赖QT的元对象系统。 3,Qt内存自动释放有两个前提条件:1. 必须是QObject的派生类 2. 必须指定了parent对象 还必须父对象被自动或者手动删除,否则不可触发。 二,事件循环 事件循环一般用exec()函数开启。QApplicaion::exec()、QMessageBox::exec()都是事件循环。其中前者又被称为主事件循环。 事件循环首先是一个无限“循环”,程序在exec()里面无限循环,能让跟在exec()后面的代码得不到运行机会,直至程序从exec()跳出。 从exec()跳出时,事件循环即被终止。QEventLoop::quit()能够终止事件循环。 其次,之所以被称为“事件”循环,是因为它能接收事件,并处理之。当事件太多而不能马上处理完的时候,待处理事件被放在一个“队列”里,称为“事件循环队列”。 当事件循环处理完一个事件后,就从“事件循环队列”中取出下一个事件处理之。当事件循环队列为空的时候,它和一个啥事也不做的永真循环有点类似,但是和永真循环不同的是,事件循环不会大量占用CPU资源。 事件循环的本质就是以队列的方式再次分配线程时间片。 三、QObject::connect 第五个参数简介 Qt::AutoConnection:默认值,使用这个值则连接类型会在信号发送时决定。如果接收者和发送者在同一个线程,则自动使用- Qt::DirectConnection类型。如果接收者和发送者不在一个线程,则自动使用Qt::QueuedConnection类型。 Qt::DirectConnection:槽函数会在信号发送的时候直接被调用,槽函数运行于信号发送者所在线程。效果看上去就像是直接在信号发送位置调用了槽函数。这个在多线程环境下比较危险,可能会造成奔溃。 Qt::QueuedConnection:槽函数在控制回到接收者所在线程的事件循环时被调用,槽函数运行于信号接收者所在线程。发送信号之后,槽函数不会立刻被调用,等到接收者的当前函数执行完,进入事件循环之后,槽函数才会被调用。多线程环境下一般用这个。 Qt::BlockingQueuedConnection:槽函数的调用时机与Qt::QueuedConnection一致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运行完。接收者和发送者绝对不能在一个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个。 Qt::UniqueConnection:这个flag可以通过按位或(|)与以上四个结合在一起使用。当这个flag设置时,当某个信号和槽已经连接时,再进行重复的连接就会失败。也就是避免了重复连接。 Qt::AutoCompatConnection:是为了连接Qt4与Qt3的信号槽机制兼容方式,工作方式与Qt::AutoConnection一样。 四、QIODevice 【信号】void readyRead() 有新数据可用于从设备的当前读取通道读取时,都会发出此信号。 readyRead() 不会递归发出。 子类化 QIODevice 应注意:仅当新数据到达时发出 readyRead() (不要仅仅因为缓冲区中还有数据要读取而发出它)。不要在其他条件下发出 readyRead()。 1.4、子类化QIODevice 通过继承 QIODevice,可以为自定义的 I/O 设备提供相同的接口。QIODevice 的子类只需要实现protected 的 readData() 和 writeData() 函数。 QIODevice 使用这些函数来实现它所有的便利函数,例如 getChar()、readLine() 和 write()。 QIODevice 还为您处理访问控制,因此如果调用 writeData(),可以放心地假设设备以写入模式打开。 一些子类,例如 QFile 和 QTcpSocket,是使用内存缓冲区实现的。这减少了所需的设备访问调用的数量,这些调用通常非常慢。缓冲使 getChar() 和 putChar() 之类的函数变得更快,因为它们可以在内存缓冲区上操作,而不是直接在设备本身上操作。 但是,某些 I/O 操作不适用于缓冲区。例如,如果几个用户打开同一个设备并逐个字符地读取它,当他们打算分别读取一个单独的块时,他们最终可能会读取相同的数据。 因此,QIODevice 允许通过将 Unbuffered 标志传递给 open() 来绕过任何缓冲。子类化 QIODevice 时,注意绕过设备在无缓冲模式下打开时可能使用的任何缓冲区。 1.5、多通道通信 一些顺序设备支持通过多个通道进行通信。这些通道具有独立数据流。 打开设备后,可以通过调用 readChannelCount() 和 writeChannelCount() 函数来确定通道数。 要在通道之间切换,可分别调用 setCurrentReadChannel() 和 setCurrentWriteChannel()。 QIODevice 还提供额外的信号来处理基于每个通道的异步通信。