我需要在我的代码中包含以下标题:
#include <5.4.1/QtGui/private/qzipwriter_p.h>
问题是,我们正在其他Qt版本上编译它,例如5.4.2或5.5.x
我知道我不应该使用这些“私有”标题,因为它们不受支持,但我们至少需要它们,直到我们有一个持久的替代品。
如何在路径中连接QT_VERSION_STR
变量,以便适用于所有版本?
答案 0 :(得分:4)
改为使用QT_VERSION
:
QT_VERSION 此宏扩展了指定Qt版本号的形式0xMMNNPP(MM = major,NN = minor,PP = patch)的数值。
#if QT_VERSION == 0x050401
#include <5.4.1/QtGui/private/qzipwriter_p.h>
#endif
修改强>
不知道在路径中连接版本字符串吗?
标准不允许(16.3.4 / 3):
生成的完全宏替换的预处理标记序列不会作为预处理进行处理 指令,即使它类似于一个
因此,您无法创建一个将扩展为#include
指令的宏。您也无法在include
(#include <like this>
)的括号内使用宏,因为括号内的所有内容都只是一个字符串。
答案 1 :(得分:2)
您可以使用人类可读帮助QT_VERSION_CHECK
来比较数字QT_VERSION
宏,该帮助C Macro - Dynamic #include将主要,次要和补丁编号组合为QT_VERSION
格式:
#if QT_VERSION == QT_VERSION_CHECK(5, 4, 1)
//...
#endif
从GCC标题QT_*_VERSION
问题是我们没有Qt major,minor和patch版本的宏令牌。只有数字QT_VERSION
。因此,获得所需数字很棘手。可以使用.pro
变量{{3}}从qmake
文件中将它们作为宏定义传输:
DEFINES += QT_MAJOR_VERSION=$$QT_MAJOR_VERSION
DEFINES += QT_MINOR_VERSION=$$QT_MINOR_VERSION
DEFINES += QT_PATCH_VERSION=$$QT_PATCH_VERSION
现在这些宏版本可以在源文件中使用:
// To return as a string: "5.4.1/QtGui/private/qzipwriter_p.h"
#define qt_header__(x) #x
#define qt_header_(major,minor,patch) qt_header__(major.minor.patch/QtGui/private/qzipwriter_p.h)
#define qt_header(major,minor,patch) qt_header_(major,minor,patch)
// Simpler without stringification, however Qt Creator cannot follow
// that header
#define qt_header(major,minor,patch) <major.minor.patch/QtGui/private/qzipwriter_p.h>
#include qt_header(QT_MAJOR_VERSION, QT_MINOR_VERSION, QT_PATCH_VERSION)
最好使用字符串变体("5.4.1/QtGui/private/qzipwriter_p.h"
)。在这种情况下,Qt Creator的最新版本可以遵循这样的qt_header()
宏并相应地突出显示文本。
答案 2 :(得分:0)
使用cmake就可以这样:
的CMakeLists.txt:
find_package(Qt5 COMPONENTS Core Qml)
add_definitions(-DQT_VERSION_MAJOR=${Qt5_VERSION_MAJOR})
add_definitions(-DQT_VERSION_MINOR=${Qt5_VERSION_MINOR})
add_definitions(-DQT_VERSION_PATCH=${Qt5_VERSION_PATCH})
yourcode.cpp:
#define p_qqmljslexer(major,minor,patch) <major.minor.patch/QtQml/private/qqmljslexer_p.h>
#include p_qqmljslexer(QT_VERSION_MAJOR, QT_VERSION_MINOR, QT_VERSION_PATCH)
答案 3 :(得分:0)
带有两个字母的minor_version,例如5.11无效,但是有效
#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)
auto isok = f.open(QIODevice::NewOnly| QIODevice::Text);
#else
auto isok = !QFileInfo::exists(newfile) && f.open(QIODevice::Text);
#endif