很多人以为 connect 和 disconnect 应该像 new 和 delete 一样成对出现 这是错误的(只要 sender 或 receiver 其中之一不存在了,connect 会自动失效。QObject::connect 函数是线程安全的)


其实我写文章也是边查资料边编辑的

有时候是怕自己的阐述不严谨,有时候是怕自己重复造轮子

就像有些人不停的教大家QLabel QDialog QWidget 个人是不屑的


命令模式

用 Qt's Undo Framework 来举例最恰当不过了

QUndoCommand Class 里简单介绍了下用法

class AppendText : public QUndoCommand { public: AppendText(QString *doc, const QString &text) : m_document(doc), m_text(text) { setText("append text"); } virtual void undo() { m_document->chop(m_text.length()); } virtual void redo() { m_document->append(m_text); } private: QString *m_document; QString m_text; }; 

Qt Undo Framework 里详细描述了4个类的用法和注意点

Qt Undo Framework Demo 里翻译了官方的一个例子


观察者模式

这个自然是用 Qt 的 signal-slots 机制来举例了

DevBean Tech World 豆子是很早的 Qt 博主,这篇文章也写的很详细,就不狗尾续貂了

 

一般大家都喜欢大谈特谈 QObject::connect 函数的前4个参数

其实第五个参数才值得被讨论讨论

Threading Basics

You’re doing it wrong…(QThread with SIGNAL-SLOT)

Threads Events QObjects

QThreads general usage

Threading without the headache - Qt Blog

 

接下来可以谈谈的是 connect 里的参数类型,必须是可以转义成 QVariant 的类型

如果用了自定义类型,需要通过 qRegisterMetaType 或 Q_DECLARE_METATYPE 来注册

Differences between String-Based and Functor-Based Connections

 

然后可以一提的是 QObject::connect 函数是线程安全的

Reentrancy and Thread-Safety

 

最后可以说说 connect 和 lambda 的结合,这是 Qt5 的特性

connect(action, &QAction::triggered, engine, [=]() { engine->processAction(action->text()); }); 

顺便说下 disconnect 函数

这个函数不要在析构函数里显示的去调用它

很多人以为 connect 和 disconnect 应该像 new 和 delete 一样成对出现

这是错误的

只要 sender 或 receiver 其中之一不存在了,connect 会自动失效

https://zhuanlan.zhihu.com/p/32138947


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM