Qt中两个类通过信号槽进行传输数据遇到的问题

发布于:2022-12-25 ⋅ 阅读:(330) ⋅ 点赞:(0)

1.场景需求

  • 在QGraphicsItem类中发生重绘后,希望将改动的信息在主窗口MainWindow中的textedit控件中显示出来。
  • 例如在选中的QGraphicsItem生成的对象item后,在被鼠标选中时,在textedit中显示这个对象相应的信息。

2.实现方案

  • 在网上查询相关资料后,发现qt实现两个类进行通信、数据传输或联动时,有以下设置方法:
    • 设置全局变量
    • 使用信号槽
    • 使用接口类
  • 本文选用信号槽进行连接,因为需要根据选中不同的item,相应显示item的信息并可以多次选择。

3.遇到问题及解决方案

  • 在QGraphicsItem类设置信号,在MainWindow类设置槽函数,并进行connect。发现报错,
  • 反复确认connect的语法格式没有写错之后,仍然报错。
  • 使用信号槽机制要继承自QObject类或其派生类,并使用Q_OBJECT宏
    • 继承QObject 类后并添加宏,仍然报错,
  • 继承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的思路:多是自己直接搜索报错信息,整理网上资料所得。还是理清思路,规整代码,以清晰问题所在。
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到