QsciScintilla qobject_cast转换的相关问题介绍

  1. parentWidget->findChildren<QsciScintilla*>();只能找到继承自QsciScintilla的子对象,而QsciScintilla本身实例化的对象,是找不到的。究其原因:findChildren内部调用的是 qobject_cast 函数,该函数因为无法成功,导致找不到子对象的现象。qobject_cast函数的特性:QsciScintilla实例化的对象往自己类QsciScintilla转换会失败, 除开QsciScintilla之外,其它QsciScintilla子类对象都能往QsciScintilla转换能成功,因为导致findChildren同现象的。如果把qobject_cast 函数换成c++自身的dynamic_cast就一切能正常判断
  2. 判断继承自inherits("QsciScintilla")功能正常。
  3. metaObject()->className()也总能正确。

应该是跟QsciScintilla源码编译成库时候类的写法之类的有关系,因为qobject_cast 函数要能成功转换,需要有一些限制条件:(看了QsciScintilla源码,虽然都采用了下述限制条件的,但是不知道为什么这样了,有知道的可以欢迎来讨论,因为这个问题牵扯到qt元对象系统,大量的宏控制以及底层元素,先不研究这个问题了)

使用限制:
T类型必须继承自QObject
在声明时必须有Q_OBJECT宏。

或者一些其它声明导致的bug吧(也可能qt本身有bug也有可能),例如Qt 之 qobject_cast 分析及QTBUG 20616-CSDN博客

所以,如果想能用代码自动找出来QsciScintilla对象(例如实现自动的信号和槽链接),可以如下两种做法:

  1. 采用函数parentWidget->findChildren<QAbstractScrollArea*>()来找到所有可能是QsciScintilla的子对象,然后再用inherits("QsciScintilla")来判断选取出来,而不是parentWidget->findChildren<QsciScintilla*>()的方式了;
  2. 编辑器对象别自己用QsciScintilla来实例化了,而是自己实现个它的子类XX,然后用该子类来实例化出编辑器对象,然后就可以正常采用parentWidget->findChildren<QsciScintilla*>()的方式了。

参考博客:

关于qt中能使用的几种类型转换函数讲解:Qt/c++类型转换总结_qt c++类型转换-CSDN博客

posted @ 2024-11-24 14:44  我是标同学  阅读(0)  评论(0)    收藏  举报  来源