【Qt6项目转Qt5项目的一些API设置】
Qt6项目转Qt5项目的一些API设置
- 本文目的
- 我使用Qt5改好的仓库
- 正文
- 0. cmake的改动
- 1. enterEvent
- 2. nativeEvent
- 3. #include <QOverload>
- 4. QDesktopWidget
- 5.QMouseEvent::globalPosition 不存在
- 6.QMediaPlayer::setSource 不存在
- 7.QMediaPlayer::playbackState 不存在
- 8.无法打开源文件 "ui_QtAntDesign.h"
- 9.字符串编码和 Qt
本文目的
以下面这个仓库为例:
https://github.com/byralpha/AntDesign
这个仓库是Qt6的项目,现在我们尝试使用cmake+qt5.15.2+vs2022将项目运行起来。
我使用Qt5改好的仓库
https://github.com/1AoB/AntDesign
正文
0. cmake的改动
改动说明:
- qt6全改成qt5
- OpenGLWidgets改为OpenGL
- 有一个问题:
如上图:将qt6_wrap_ui(UI_HEADERS ${FORM_FILES})
改为Qt5_wrap_ui(UI_HEADERS ${FORM_FILES})
,因为使用的是不分大小的全部替换,如果程序找不到ui_*.h
,注意这里改为qt5_wrap_ui(UI_HEADERS ${FORM_FILES})
试试 - 注意:
原CMakeLists.txt中,target_link_libraries(${PROJECT_NAME} PRIVATE Dwmapi)了两次,删掉前面那次(如上图所示),只保留后面的target_link_libraries
1. enterEvent
- enterEvent 在 Qt5 的签名是:
void enterEvent(QEvent *event) override;
- Qt6的写法:
void enterEvent(QEnterEvent *event) override; // ❌ 这是 Qt6 的写法
2. nativeEvent
- nativeEvent 在 Qt5 的签名是:
bool nativeEvent(const QByteArray &eventType, void *message, long *result) override;
- Qt6的写法:
bool nativeEvent(const QByteArray &eventType, void *message, qintptr *result) override;
3. #include
- 实际上 Qt5 和 Qt6 都没有单独的 QOverload 头文件。
QOverload 定义在 <QtCore/qobjectdefs.h> 里:
#include <QtCore/qobjectdefs.h>
4. QDesktopWidget
- 在 Qt 5.15 中 QDesktopWidget 已经被 废弃 (deprecated),但仍然存在。
你可以加上#include <QDesktopWidget>
来规避错误,也可以使用QScreen
// 老写法
QDesktopWidget *desktop = QApplication::desktop();
QRect screenRect = desktop->availableGeometry();// 新写法 (Qt 5.15 推荐)
QScreen *screen = QGuiApplication::primaryScreen();
QRect screenRect = screen->availableGeometry();
建议直接加上#include <QDesktopWidget>
就行了,但是如果是写自己的项目,还是要用新API的
5.QMouseEvent::globalPosition 不存在
// Qt6 写法
// event->globalPosition()// Qt5 写法
event->globalPos()
//另外,在cpp中不需要event->globalPos().toPoint(),
//但是如果是Qt6的话,要写event->globalPosition().toPoint()
//因为在qt5中`QPoint::toPoint 不存在`
-
toPoint() 是 QPointF 的方法(Qt5、Qt6 都有)。
-
在 Qt5 中 QPoint 本身就是整型点,没有 toPoint(),因为它已经是 QPoint 了。
6.QMediaPlayer::setSource 不存在
player->setSource改为player->setMedia
Qt6 写法:
player->setLoops(QMediaPlayer::Infinite);
在Qt5中没有对应的写法:
直接屏蔽掉,这个需要自己在qt5中造轮子
7.QMediaPlayer::playbackState 不存在
Qt6
if (player->playbackState() == QMediaPlayer::PlayingState) { ... }
Qt5改为:
if (player->state() == QMediaPlayer::PlayingState) { ... }
8.无法打开源文件 “ui_QtAntDesign.h”
首先,用everything查看一下ui_QtAntDesign.h是否存在,如果存在,这关掉vs2022,使用cmake重新生成一下,并打开vs2022应该就解决了。
9.字符串编码和 Qt
- 为什么乱码
这个项目使用的是utf-8编码,并且作者的电脑编码也是utf-8编码。
我们git下来,程序也是utf-8编码,但是一般情况下(只要自己不主动修改),那这个微软电脑在中国区默认是GDK,程序编码与电脑不一致,所以乱码 - 解决办法
目的 :将"([\u4e00-\u9fa5]+)"
替换为QString::fromLocal8Bit("$1")
- 步骤:
-
打开 Ctrl+Shift+H → “在文件中替换”
-
勾选 使用正则表达式
(匹配中文字符串):
"([\u4e00-\u9fa5]+)"
说明:
[\u4e00-\u9fa5] 是 Unicode 中文范围"..." 包裹的中文字符串都会匹配
替换为:QString::fromLocal8Bit("$1")
注意:VS 正则的 $1 对应捕获组
如下图所示:
如果你想要ctrl + F 搜索的话,一定要打开 * 按钮