首页 / C++ / C++模板类与Qt信号槽混用
C++模板类与Qt信号槽混用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++模板类与Qt信号槽混用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2257字,纯文字阅读大概需要4分钟。
内容图文
一、正文
目前正在做一个视频处理相关的项目。项目的技术栈是这样的,UI层采用Qt来实现基本的数据展示和交互,底层音视频采用的是一套基于FFmpeg的视频处理框架。这是一套类似Microsoft Media Foundation的处理框架,采用管道流进行架构,解复用、解码、复用、编码及用户自定义操作都采用Filter组件来实现,灵活度和可扩展性都比较好。(基本上常用音视频处理框架都采用了这一架构,如Microsoft Media Foundation, DirectShow Filter, gstreamer)
项目要求视频在处理的过程中,实时计算出当前的进度并展示在UI上,方便用户随时查看处理进度。想象中的处理方式是:负责Progress的Filter每一次计算进度的时候都发送一个信号给UI,方便更新进度条。于是ProgressFilter的实现大致如下:
template<typename DataType> class ProgressFilter : public ins::MediaFilter<DataType,DataType>, public QObject{ Q_OBJECT public: ~ProgressFilter() = default; ProgressFilter(uint64_t totalFrames = 1) : mCurrentFrameIndex(0), mTotalFrames(totalFrames) { } bool Init(ins::MediaContext* ctx) { return this->next_filter_->Init(ctx); } bool Filter(ins::MediaContext* ctx, const DataType& data) { double progress = std::min((double)(++mCurrentFrameIndex) / mTotalFrames, 0.99); emit progressChanged(progress); return this->next_filter_->Filter(ctx, data); } void Close(ins::MediaContext* ctx) { this->next_filter_->Close(ctx); } void Notify(ins::MediaContext* ctx, const ins::MediaNotify& notify) { if (notify.type == ins::kNotifyEOF) { double progress = std::min(std::ceil((double)mCurrentFrameIndex / mTotalFrames), 1.0); emit progressChanged(progress); } this->next_filter_->Notify(ctx, notify); } signals: void progressChanged(double progress); private: uint64_t mCurrentFrameIndex; uint64_t mTotalFrames; };
然而编译的时候却提示报错:
错误提示已经很显然了,Q_OBJECT宏不支持C++模板类。Qt中一个类如果需要支持信号槽机制,那么必须要加一个Q_OBJECT做预处理。而项目当前使用的这套视频处理框架又大量使用了模板技术,改源码显然不大现实。那么就没有办法了吗?网上搜了一下就找到了一个解决办法。那就是实现一个普通的中间类,在这个类中定义信号槽。然后再让模板类继承这个中间类即可。所以我们实现一个中间类:
class Proxy : public QObject { Q_OBJECT public: explicit Proxy(QObject *parent = 0) : QObject(parent) {} signals: void progressChanged(double progress); }; template<typename DataType> class ProgressFilter : public ins::MediaFilter<DataType,DataType>, public Proxy { public: ~ProgressFilter() = default; ...... }
这样,我们的模板类就可以正常使用信号槽机制了。
二、参考链接
1. https://stackoverflow.com/questions/4397478/qt-templated-q-object-class
原文:https://www.cnblogs.com/csuftzzk/p/qt_mix_with_template.html
内容总结
以上是互联网集市为您收集整理的C++模板类与Qt信号槽混用全部内容,希望文章能够帮你解决C++模板类与Qt信号槽混用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。