1.场景需求
- 在QGraphicsItem类中发生重绘后,希望将改动的信息在主窗口MainWindow中的textedit控件中显示出来。
- 例如在选中的QGraphicsItem生成的对象item后,在被鼠标选中时,在textedit中显示这个对象相应的信息。
2.实现方案
- 在网上查询相关资料后,发现qt实现两个类进行通信、数据传输或联动时,有以下设置方法:
- 本文选用信号槽进行连接,因为需要根据选中不同的item,相应显示item的信息并可以多次选择。
3.遇到问题及解决方案
- 在QGraphicsItem类设置信号,在MainWindow类设置槽函数,并进行connect。发现报错,
- 反复确认connect的语法格式没有写错之后,仍然报错。
- 使用信号槽机制要继承自QObject类或其派生类,并使用Q_OBJECT宏
- 继承QObject 类要指明public继承方式。
- 添加QObject出现的问题,报错
error: 'staticMetaObject' is not a member of 'QGraphicsItem'
error: 'qt_metacast' is not a member of 'QGraphicsItem'
error: 'qt_metacall' is not a member of 'QGraphicsItem'
-
Multiple Inheritance Requires QObject to Be First(多重继承QObject一定要放在前面)
-
若出现编译时出现警告 Warning: Class Node implements the interface QGraphicsItem but does not list it in Q_INTERFACES. qobject_cast to QGraphicsItem will not work!
- 在类的声明(Q_OBJECT下面)中添加:Q_INTERFACES(QGraphicsItem)可解决该问题.
-
在未继承QObject 类中,重新继承和添加Q_OBJECT时,要重新qmake和构建一下。
总结:
- 注意信号与槽的使用条件,
- 注意QObject继承的方式和顺序
- 解决bug的思路:多是自己直接搜索报错信息,整理网上资料所得。还是理清思路,规整代码,以清晰问题所在。