Qt5兼容使用之前Qt4接口 intersect接口

1. 问题

项目卡中遇到编译报错, 错误 C2039 “intersect”: 不是“QRect”的成员 。
在这里插入图片描述

2. 排查过程

排查到依赖的第三方代码,使用 intersect 接口, 跟踪排查到头文件中使用了***#if QT_DEPRECATED_SINCE(5, 0)***

#if QT_DEPRECATED_SINCE(5, 0)
    Q_REQUIRED_RESULT QT_DEPRECATED QRect unite(const QRect &r) const Q_DECL_NOTHROW { return united(r); }
    Q_REQUIRED_RESULT QT_DEPRECATED QRect intersect(const QRect &r) const Q_DECL_NOTHROW { return intersected(r); }
#endif

    friend Q_DECL_CONSTEXPR inline bool operator==(const QRect &, const QRect &) Q_DECL_NOTHROW;
    friend Q_DECL_CONSTEXPR inline bool operator!=(const QRect &, const QRect &) Q_DECL_NOTHROW;

#if QT_DEPRECATED_SINCE(5, 0) 表示qt 5.0版本已经弃用这个接口,这个问题 就是使用弃用的版本接口,那么问题就排查到了,库使用了qt4的接口,我们QT编译版本是Qt5.15, 上面显示Qt5.0以后就弃用了。

3. 解决

那我们就要解决Qt版版接口兼容问题了。下面有个方法:

  • 方法一: 一般情况下弃用某个接口,会相应的有替代接口,经过查找手册这个代码附近就有这样的接口 QRect::intersected 一样的功能,可以更改源码将intersect 改为intersected解决
  • 方法二: 很多情况下,我们没办法修改源码,或者修改工作量太大等原因。就需要做接口兼容了, qt有这样的一个宏QT_DISABLE_DEPRECATED_BEFORE,宏允许你指定你的代码所支持的 Qt 最低版本 查看手册了解具体解释和使用方法

在这里插入图片描述

QT_DISABLE_DEPRECATED_BEFORE=0x050100 支持Qt5.1, 那我们要支持Qt4 可以限定
在pro文件中添加

DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x040900  //支持使用最低4.9版本接口

我这里使用cmake编译,在CMakeLists.txt中添加:

ADD_DEFINITIONS("-DQT_DISABLE_DEPRECATED_BEFORE=0x040900")

4.拓展

至此这问题就解决了,第二个方法就比较通用了。

DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x040900 //支持qt4.9
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x050000 //支持qt5.0
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x050F00  //支持qt5.15
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000  //支持qt6.0

我们用这个宏就可以做一些事情了,比如多个开发团队统一代码版本,升级代码等工作了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您想在Qt中计算两个对象的交集(intersection),您可以使用QRect、QPolygon和QRegion等Qt中的几何类。 例如,如果您想计算两个矩形的交集,您可以使用QRectintersected函数。示例代码如下: ``` QRect rect1(0, 0, 100, 100); QRect rect2(50, 50, 100, 100); QRect intersection = rect1.intersected(rect2); ``` 在这个例子中,rect1和rect2分别表示两个矩形,intersected函数将返回它们的交集,即(50, 50, 50, 50)。 对于更复杂的形状,您可以使用QPolygon和QRegion。例如,如果您想计算两个多边形的交集,您可以使用QPolygon的intersected函数。示例代码如下: ``` QPolygon polygon1; polygon1 << QPoint(0, 0) << QPoint(100, 0) << QPoint(100, 100) << QPoint(0, 100); QPolygon polygon2; polygon2 << QPoint(50, 50) << QPoint(150, 50) << QPoint(150, 150) << QPoint(50, 150); QPolygon intersection = polygon1.intersected(polygon2); ``` 在这个例子中,polygon1和polygon2分别表示两个多边形,intersected函数将返回它们的交集。 对于更复杂的形状,您可以使用QRegion。QRegion可以表示任意复杂的形状,包括矩形、多边形和椭圆等。您可以使用QRegion的intersected函数来计算两个QRegion的交集。示例代码如下: ``` QRegion region1(QRect(0, 0, 100, 100), QRegion::Ellipse); QRegion region2(QRect(50, 50, 100, 100), QRegion::Ellipse); QRegion intersection = region1.intersected(region2); ``` 在这个例子中,region1和region2分别表示两个椭圆形状的QRegion,intersected函数将返回它们的交集。 希望这些示例代码能够帮助您计算两个对象的交集。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值