- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Qt编码经验总结
Qt编码经验总结关于信号槽1.信号槽基本属性:一个信号可以和多个槽相连当信号发出后,槽会一个接一个的被调用到,调用顺序和连接顺序一致。多个信号可以连接到一个槽一个信号可以连接到另外一个信号槽可以被取消连接信号槽可以使用显式连接,也可以隐式连接显式连接使用:QObject::connect()方法进行连接隐式连接遵循:void on_widget name_signal name(signal parameters);关于信号槽的连接方式不建议用Qt::BlockingQueuedConnection方式,因为它会阻塞抛出信号所在线程,直到槽函数返回,有可能造成死锁;当信号发送者和信号接收者不在同一线程时,默认的连接方式是队列连接,即Qt::QueuedConnection,不建议强制改成直连方式(Qt::DirectConnection),因为这可能导致一些意想不到的问题,比如一些不可重入的GUI类可能会在非主线程中被调用到,导致程序异常崩溃。2.信号槽使用注意点:不建议把指针或者引用作为信号槽的参数首先因为指针不易控制,而且也会面临在槽函数中被析构的状况,导致程序出错几率增加。当然,如果单纯为了避免指针被析构的危险,可以传递const,这样也可以提高效率,但是有一个例外,那就是当信号槽是使用Qt::QueuedConnection方式连接的情况,当槽函数被执行到的时候,引用所依附的对象很有可能是一个临时变量,或许早已析构,这个和在函数体内返回一个临时变量的引用是一回事。所以最保险的方法是传值。当使用Qt::QueuedConnection方式连接信号槽时,建议参数传递使用传值,而非指针或者引用。对于自定义数据类型,要使用qRegisterMetaTypeMyClass(MyClass);来注册自定义类型,最好也实现自定义类型的拷贝构造函数,该拷贝构造函数会在发送信号时被调用到。对于已经不需要的信号槽连接要及时取消连接(QObject::disconnect())。最好检查每一次的信号槽连接是否成功。除非特殊需求,否则不要在槽函数中发射连接到此槽函数的任意一个信号。如果有使用,要注意控制避免死循环的发生。关于多线程之可重入与线程安全在Qt文档中,术语“可重入”与“线程安全”被用来说明一个函数如何用于多线程程序。假如一个类的任何函数在此类的多个不同的实例上,可以被多个线程同时调用,那么这个类被称为是“可重入”的。假如不同的线程作用在同一个实例上仍可以正常工作,那么称之为“线程安全”的。由此可见,线程安全函数肯定是可重入的,可重入的函数并不一定是线程安全的。1.Qt中的大多数类是非线程安全的,有一些线程相关类是线程安全的线程安全类主要有QMutex,QMutexLocker,线程安全函数主要有QCoreApplication::postEvent(),QCoreApplication::processEvents()等,在Qt Assistant中线程安全类,线程安全函数都会以thread-safe来作标识,在多线程使用时应予以关注。2.Qt中的大多数类是可重入的Qt的GUI类,特别是QWidget与它的所有子类都是不可重入的,这些GUI类只能用于主线程,所以应当注意不要在非主线程中来操作GUI类,否则会异常崩溃,这也就是前面所提到的当信号发送者和信号接收者不在同一线程时,默认的连接方式是队列连接,即Qt::QueuedConnection,不建议强制改成直连方式(Qt::DirectConnection)的原因所在。3.逐线程事件循环每个线程可以有它的事件循环,主线程开始它的事件循环需使用QCoreApplication::exec(),别的线程开始它的事件循环需要用QThread::exec().像QCoreApplication一样,QThreadr提供了exit(int)函数,一个quit() slot。Qt中的一些非GUI类(比如QTimer,QTcpSocket,QProcess等)的运行机制是需要事件循环的,比如,在一个线程中使用了QTimer,而没有在Run()函数中用QThread::exec(),则QTimer就不会发射它的timeout()信号。对deleteLater()也不会工作。因为deleteLater()本身也是依靠事件循环的,就是向自身抛出了一个延期删除事件而已,即QApplication::postEvent(this, new QEvent(QEvent::DeferredDelete))。需要明确的几点:对象所在线程对象所在线程是指构造该对象的线程,比如在主线程中创建线程A,而在A的Run()函数中创建对象object,则object所属线程是A线程,而A线程本身所属线程是主线程。明确这个概
您可能关注的文档
最近下载
- API 620-2013-2013(2021)大型焊接低压储罐的设计与建造(中英文编译版)2-1部分.pdf
- 2022.6.17 中级考试试卷复习(杨老师-选择题).docx VIP
- 电大国家开放大学《当代中国政治制度》(本)2025-2025期末试题及答案.docx VIP
- 2025-2031年中国宠物药行业市场调查研究及发展趋势预测报告.docx
- 2026网联清算有限公司校园招聘笔试参考题库及答案解析.docx VIP
- 中职素描课程说课课件设计.pptx VIP
- 污水BOD、COD、SS、氨氮、PH检测方法以和原理等等.doc VIP
- 青春期心理健康教育的系列讲座.ppt VIP
- 居住区绿化设计毕业论文.doc VIP
- 凝结水精处理系统技术协议.doc VIP
原创力文档


文档评论(0)