Qt队列的使用

一、queue:队列

队列是一种先进先出的数据结构,是一个模板类。队列和栈是一种数据逻辑概念,即数据能进行的操作。

主要区别是:队列先进先出(First In First Out),栈后进先出

链表和顺序表是一种数据存放方式,主要区别是:链表有节点,通过指针找到下一个节点,因此在内存中链表数据不需要连续存放;顺序表则是连续存放,通过第一个元素就可以找到其他元素。

二、C++中的队列

需要头文件 #include<queue>

queue<int> q;              //定义一个int型队列,其他常用基本类型都可以定义

q.empty();                    //返回队列是否为空

q.size();                        //返回当前队列长度

q.front();                       //返回当前队列的第一个元素

q.back();                       //返回当前队列的最后一个元素

q.push();                    //在队列后面插入一个元素

q.pop();                         //从当前队列里移出第一个元素

三、Qt中的队列

Qt中的队列存放在头文件 #include<QQueue>中,方法和C++差不多。

QQueue<QString> q;       //定义一个QString型队列,其他常用基本类型都可以定义

q.isEmpty();                      //返回队列是否为空

q.size();                            //返回队列元素个数

q.clear();                           //清空队列

q.enqueue();                     //在队列尾部添加一个元素,比如q.enqueue("string");

q.dequeue();                     //删除当前队列第一个元素,并返回这个元素

q.head();                           //返回当前队列第一个元素

q.last();                             //返回当前队列尾部的元素

 

 

 


 

  • 23
    点赞
  • 121
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Qt使用消息队列(也称为事件队列)传递数据非常常见,特别是在多线程编程中。下面是一个简单的示例,展示如何在两个线程之间使用消息队列传递数据: ```cpp #include <QCoreApplication> #include <QThread> #include <QEvent> #include <QEventLoop> #include <QDebug> // 自定义事件类型,用于传递数据 class MyEvent : public QEvent { public: static const QEvent::Type EventType; MyEvent(int value) : QEvent(EventType), m_value(value) {} int value() const { return m_value; } private: int m_value; }; const QEvent::Type MyEvent::EventType = static_cast<QEvent::Type>(QEvent::registerEventType()); // 生产者线程 class ProducerThread : public QThread { public: void run() override { for (int i = 0; i < 10; ++i) { QCoreApplication::postEvent(qApp, new MyEvent(i)); msleep(1000); // 模拟耗时操作 } } }; // 消费者对象 class ConsumerObject : public QObject { public: ConsumerObject() { moveToThread(&m_thread); m_thread.start(); } ~ConsumerObject() { m_thread.quit(); m_thread.wait(); } // 事件处理函数,处理自定义事件类型 bool event(QEvent *event) override { if (event->type() == MyEvent::EventType) { MyEvent *myEvent = static_cast<MyEvent*>(event); qDebug() << "Received value:" << myEvent->value() << "on thread:" << QThread::currentThread(); return true; } return QObject::event(event); } private: QThread m_thread; }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 创建生产者线程 ProducerThread producer; producer.start(); // 创建消费者对象 ConsumerObject consumer; return a.exec(); } ``` 在上面的示例中,我们创建了一个自定义事件类型`MyEvent`,用于传递数据。生产者线程`ProducerThread`向消息队列中发送事件,而消费者对象`ConsumerObject`则在其自己的线程中,通过重载`event()`函数处理这些事件。当一个`MyEvent`事件被消费者对象接收时,它会打印出事件的值,并指出当前所在线程。 需要注意的是,在Qt中发送事件需要使用`QCoreApplication::postEvent()`函数,该函数可以将事件添加到应用程序的事件队列中。在消费者对象中,我们必须将它移动到一个新线程中,并在该线程中启动事件循环,以便可以接收事件。 此外,请注意,如果您使用Qt的信号和槽机制来传递数据,则不需要使用消息队列。消息队列通常用于在多个线程之间传递数据,而信号和槽机制则可在同一线程内传递数据。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值