qmake:语法

qmake:语法一 操作符 以下部分描述了如何使用运算符来操作变量的内容 赋值 运算符为变量赋值 TARGET myapp 附加值 运算符将一个新值附加到变量中的值列表 DEFINES USE MY STUFF 删除值

大家好,我是讯享网,很高兴认识大家。

一、操作符

以下部分描述了如何使用运算符来操作变量的内容。

赋值

= 运算符为变量赋值:

 TARGET = myapp

讯享网

附加值

+= 运算符将一个新值附加到变量中的值列表:

讯享网 DEFINES += USE_MY_STUFF

删除值

-= 运算符从变量的值列表中删除一个值:

 DEFINES -= USE_MY_STUFF

添加唯一值

*= 运算符将一个值添加到变量中的值列表中。这可以防止值在变量中多次包含。 例如:

讯享网 DEFINES *= USE_MY_STUFF

替换值

~= 运算符将与正则表达式匹配的任何值替换为指定值:

 DEFINES ~= s/QT_[DT].+/QT

列表中以 QT_D QT_T 开头的任何值都将替换为 QT

可变扩展

$$ 运算符用于提取变量的内容,并可用于在变量之间传递值或将它们提供给函数:

讯享网 EVERYTHING = $$SOURCES $$HEADERS message("该项目包含以下文件:") message($$EVERYTHING)

变量可用于存储环境变量的内容。

要在 qmake 运行时获取环境值的内容,请使用 $$(...) 运算符:

 DESTDIR = $$(PWD) message(该项目将安装在:$$DESTDIR)

PWD环境变量的值是在处理工程文件时读取的。要在处理生成的 Makefile 时获取环境值的内容,请使用 $(...) 运算符:

讯享网 DESTDIR = $(PWD) message(处理 Makefile 时,该项目将安装在:$$DESTDIR)

访问 qmake 属性

特殊的 $$[...] 运算符可用于访问 qmake 属性:

 message(Qt 版本:$$[QT_VERSION]) message(Qt安装在:$$[QT_INSTALL_PREFIX]) message(Qt资源可以在以下位置找到:) message(文档:$$[QT_INSTALL_DOCS]) message(头文件:$$[QT_INSTALL_HEADERS]) message(库:$$[QT_INSTALL_LIBS]) message(二进制文件(可执行文件):$$[QT_INSTALL_BINS]) message(插件:$$[QT_INSTALL_PLUGINS]) message(数据文件:$$[QT_INSTALL_DATA]) message(翻译文件:$$[QT_INSTALL_TRANSLATIONS]) message(设置:$$[QT_INSTALL_CONFIGURATION]) message(示例:$$[QT_INSTALL_EXAMPLES])

此运算符可访问的属性通常用于使第三方插件和组件能够集成到 Qt 中。例如,如果在其项目文件中进行以下声明,则 Qt Designer 插件可以与 Qt Designer 的内置插件一起安装:

讯享网 target.path = $$[QT_INSTALL_PLUGINS]/designer INSTALLS += target

二、作用域

作用域类似于过程编程语言中的 if 语句。如果某个条件为true,则处理范围内的声明。

作用域语法

作用域包括一个条件,后跟同一行上的左大括号、一系列命令和定义,以及新行上的右大括号:

 <condition> { <command or definition> ... }

左大括号必须与条件写在同一行。如以下部分所述,范围可以串联以包含多个条件。

作用域和条件

作用域被写成一个条件,后跟包含在一对大括号内的一系列声明。例如:

讯享网 win32 { SOURCES += paintwidget_win.cpp }

也可以否定给定作用域中使用的条件,以提供一组替代声明,仅当原始条件为假时才会处理这些声明。例如:

 !win32 { SOURCES -= paintwidget_win.cpp }

作用域可以嵌套以组合多个条件。例如:

讯享网 macx { CONFIG(debug, debug|release) { HEADERS += debugging.h } }

上面例子等同于:


讯享网

 macx:CONFIG(debug, debug|release) { HEADERS += debugging.h }

还可以使用运算符来执行单行条件赋值。 例如:

讯享网 win32:DEFINES += USE_MY_STUFF

: 运算符:逻辑 AND 运算符,将许多条件连接在一起,并要求所有条件都为真。

| 运算符:逻辑 OR 运算符,将多个条件连接在一起,并且只需要其中一个为真。

 win32|macx { HEADERS += debugging.h }

还可以使用 else 作用域为作用域内的声明提供替代声明。如果前面作用域的条件为假,则处理每个 else 作用域。例如:

讯享网 win32:xml { message(在Windows上构建) SOURCES += xmlhandler_win.cpp } else:xml { SOURCES += xmlhandler.cpp } else { message(未知配置) }

配置和作用域

存储在 CONFIG 变量中的值由 qmake 特别处理。每个可能的值都可以用作作用域的条件。 例如,CONFIG 保存的值列表可以用 opengl 值扩展:

 CONFIG += opengl

可以使用这个特性给最终的可执行文件一个合适的名字:

讯享网 opengl { TARGET = application-gl } else { TARGET = application }

由于可以将自定义的值放在 CONFIG 行上,这提供了一种自定义项目文件和微调生成的 Makefile 的便捷方法。

平台作用域值

可以使用作用域测试各种其他内置平台和特定于编译器的值。这些基于 Qt 的 mkspecs 目录中提供的平台规范。 例如,项目文件中的以下几行显示了 linux-g++ 规范的当前使用和测试规范:

 message($$QMAKESPEC) linux-g++ { message(Linux) }


三、变量

项目文件中使用的很多变量都是qmake在生成Makefile时使用的特殊变量,比如 DEFINESSOURCESHEADERS。 此外,可以创建自己使用的变量。 当 qmake 遇到对该名称的赋值时,它会创建具有给定名称的新变量。 例如:

讯享网 MY_VARIABLE = value

自定义的变量所做的事情没有限制,因为 qmake 将忽略它们,除非它在处理范围时需要评估它们。

还可以通过在变量名称前添加 $$ 前缀来将当前变量的值分配给另一个变量。 例如:

 MY_DEFINES = $$DEFINES #或 MY_DEFINES = $${DEFINES}

现在 MY_DEFINES 变量包含项目文件中此时 DEFINES 变量中的内容。


四、函数

qmake 提供了一系列内置函数来允许处理变量的内容。这些函数处理提供给它们的参数并作为结果返回一个值或值列表。 要将结果分配给变量,请在此类函数中使用 $$ 运算符,就像将一个变量的内容分配给另一个变量一样:

讯享网 HEADERS = model.h HEADERS += $$OTHER_HEADERS HEADERS = $$unique(HEADERS)

您可以定义自己的函数来处理变量的内容,如下所示:

 defineReplace(functionName){ #function code }

以下示例函数将变量名称作为其唯一参数,使用 eval() 内置函数从变量中提取值列表,并编译文件列表:

讯享网 defineReplace(headersAndSources) { variable = $$1 names = $$eval($$variable) headers = sources = for(name, names) { header = $${name}.h exists($$header) { headers += $$header } source = $${name}.cpp exists($$source) { sources += $$source } } return($$headers $$sources) }

五、测试函数

qmake 提供了可在编写作用域时用作条件的内置函数。这些函数不返回值,而是指示成功或失败:

 count(options, 2) { message(指定发布和调试) }

这种类型的函数应该只在条件表达式中使用。

可以定义自己的函数来为作用域提供条件。以下示例测试列表中的每个文件是否存在,如果它们都存在则返回 true,否则返回 false:

讯享网 defineTest(allFiles) { files = $$ARGS for(file, files) { !exists($$file) { return(false) } } return(true) }
小讯
上一篇 2025-03-29 23:26
下一篇 2025-01-26 14:22

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/14515.html