替换函数

qmake 提供了在配置过程中处理变量内容的函数。这些函数称为替换函数。通常,它们返回的值可以分配给其他变量。你可以在函数前加上$$ 运算符来获取这些值。替换函数可分为内置函数和函数库。

另请参阅测试函数

内置替换函数

基本替换函数作为内置函数实现。

absolute_path(path[, base])

返回path 的绝对路径。

如果未指定base ,则使用当前目录作为基目录。如果是相对路径,则在使用前相对于当前目录进行解析。

例如,下面的调用将返回字符串"/home/johndoe/myproject/readme.txt"

message($$absolute_path("readme.txt", "/home/johndoe/myproject"))

此函数在 Qt 5.0 中引入。

另请参阅clean_path()relative_path()

basename(variablename)

返回variablename 中指定的文件的 basename。

例如

FILE = /etc/passwd
FILENAME = $$basename(FILE) #passwd

cat(filename[, mode])

返回filename 的内容。您可以为mode 指定以下选项:

  • blob 将整个文件内容作为一个值返回
  • lines 将每行内容作为一个单独的值返回(不带行结束符)
  • true (默认值)和 将文件内容作为单独的值返回,按照 qmake 值列表分割规则分割(如变量赋值)。如果 是 ,只包含换行符的值将插入列表,以指示文件中的换行符位置。false mode false

clean_path(path)

返回path ,其中目录分隔符已规范化(转换为"/"),多余的分隔符已删除,". "和".. "已尽可能解决。该函数是QDir::cleanPath 的封装。

此函数在 Qt 5.0 中引入。

另请参阅absolute_path()relative_path()shell _path()system_path()

dirname(file)

返回指定文件的目录名部分。例如

FILE = /etc/X11R6/XF86Config
DIRNAME = $$dirname(FILE) #/etc/X11R6

enumerate_vars

返回所有已定义变量名的列表。

此函数在 Qt 5.0 中引入。

escape_expand(arg1 [, arg2 ..., argn])

接受任意数量的参数。它为每个参数扩展转义序列\n,\r,\t 并以列表形式返回参数。

注意: 如果指定要展开的字符串的字面意思,则需要转义反斜线,如下代码片段所示:

message("First line$$escape_expand(\\n)Second line")

find(variablename, substr)

返回variablename 中与正则表达式substr 匹配的所有值。

MY_VAR = one two three four
MY_VAR2 = $$join(MY_VAR, " -L", -L) -Lfive
MY_VAR3 = $$member(MY_VAR, 2) $$find(MY_VAR, t.*)

MY_VAR2 将包含"-Lone -Ltwo -Lthree -Lfour -Lfive",MY_VAR3 将包含 "three two three"。

files(pattern[, recursive=false])

扩展指定的通配符模式并返回文件名列表。如果recursive 为 true,则此函数会递归到子目录。

first(variablename)

返回variablename 的第一个值。

例如,下面的调用会返回firstname

CONTACT = firstname middlename surname phone
message($$first(CONTACT))

另请参阅take_first()last()

format_number(number[, options...])

按照options 指定的格式返回number 。可以指定以下选项:

  • ibase=n 将输入的基数设置为n
  • obase=n 设置输出的基数为n
  • width=n 将输出的最小宽度设置为 。如果输出短于 ,则用空格填充n width
  • zeropad 用 0 代替空格填充输出
  • padsign 在输出的正值前加上空格
  • alwayssign 在输出的正值前加上加号
  • leftalign 将填充放在输出值的右边

目前不支持浮点数。

例如,下面的调用将十六进制数BAD 转换为002989

message($$format_number(BAD, ibase=16 width=6 zeropad))

此函数在 Qt 5.0 中引入。

fromfile(filename, variablename)

filename 作为 qmake 项目文件进行评估,并返回分配给variablename 的值。

另请参阅infile()

getenv(variablename)

返回环境变量variablename 的值。这主要等同于$$(variablename) 语法。不过,getenv 函数支持名称中带有括号的环境变量。

此函数在 Qt 5.12 中引入。

join(variablename, glue, before, after)

variablename 的值与glue 连接起来。如果该值不是空值,则该函数会以before 作为前缀,以after 作为后缀。variablename 是唯一的必填字段,其他字段默认为空字符串。如果需要对gluebeforeafter 中的空格进行编码,则必须加引号。

last(variablename)

返回variablename 的最后一个值。

例如,以下调用将返回phone

CONTACT = firstname middlename surname phone
message($$last(CONTACT))

另请参阅take_last()first()

list(arg1 [, arg2 ..., argn])

接受任意数量的参数。它会创建一个包含参数列表的唯一命名变量,并返回该变量的名称。您可以使用该变量编写一个循环,如下代码片段所示

for(var, $$list(foo bar baz)) {
    ...
}

而不是

values = foo bar baz
for(var, values) {
    ...
}

lower(arg1 [, arg2 ..., argn])

接收任意数量的参数并将其转换为小写。

另请参阅upper()

member(variablename [, start [, end]])

返回variablename 列表值的片段,其元素索引在startend 之间(含)。

如果未给出start ,则默认为零。这种用法等同于$$first(variablename)

如果未给出end ,则默认为start 。这种用法代表简单的数组索引,因为将返回一个元素。

也可以在单个参数中指定开始和结束,数字之间用两个句号隔开。

负数表示从列表末尾开始的索引,-1 表示最后一个元素。

如果任一索引超出范围,则返回空列表。

如果end 小于start ,则按相反顺序返回元素。

注意: 末尾索引是包含且无序的,这意味着只有当索引无效时(输入变量为空时),才会返回空列表。

另请参阅str_member()

num_add(arg1 [, arg2 ..., argn])

接收任意数量的数字参数并将其相加,返回总和。

由于可以简单地在数值前加上减号来否定数值,因此隐式支持减法:

sum = $$num_add($$first, -$$second)

如果操作数已经是负数,则需要另一个步骤对数字进行归一化处理:

second_neg = -$$second
second_neg ~= s/^--//
sum = $$num_add($$first, $$second_neg)

该函数在 Qt 5.8 中引入。

prompt(question [, decorate])

显示指定的question ,并返回从 stdin 读取的值。

如果decoratetrue(默认值),问题将获得一个通用前缀和后缀,以标识其为提示符。

quote(string)

将整个string 转换为单个实体并返回结果。这只是将字符串括入双引号的一种花式方法。

re_escape(string)

用反斜杠转义每个特殊正则表达式字符后,返回string 。该函数是QRegularExpression::escape 的封装函数。

read_registry(tree, key[, flag])

返回树tree 中注册表键key 的值。

仅支持HKEY_CURRENT_USER (HKCU) 和HKEY_LOCAL_MACHINE (HKLM) 树。

flag 可以是WOW64_32KEY (32) 或WOW64_64KEY (64)。

注: 此函数仅适用于 Windows 主机。

此函数在 Qt 5.12.1 中引入。

relative_path(filePath[, base])

返回filePath 相对于base 的路径。

如果未指定base ,则为当前项目目录。如果是相对路径,则在使用前将其解析为相对于当前项目目录的路径。

如果filePath 是相对路径,则会首先根据基本目录进行解析;在这种情况下,该函数实际上就像 $$clean_path()。

此函数在 Qt 5.0 中引入。

另请参阅absolute_path()clean_path()

replace(string, old_string, new_string)

在作为string 提供的变量内容中,用new_string 替换old_string 的每个实例。例如,代码

MESSAGE = This is a tent.
message($$replace(MESSAGE, tent, test))

打印信息:

This is a test.

resolve_depends(variablename, prefix)

这是一个内部函数,您通常用不着它。

该函数在 Qt 5.0 中引入。

reverse(variablename)

以相反顺序返回variablename 的值。

此函数在 Qt 5.0 中引入。

section(variablename, separator, begin, end)

返回variablename 值的一部分。该函数是QString::section 的包装器。

例如,下面的调用会输出surname

CONTACT = firstname:middlename:surname:phone
message($$section(CONTACT, :, 2, 2))

shadowed(path)

映射从项目源代码目录到构建目录的路径。对于源代码内构建,该函数返回path 。如果path 指向源代码树之外,则返回空字符串。

此函数在 Qt 5.0 中引入。

shell_path(path)

path 中的所有目录分隔符转换为与构建项目时使用的 shell(即 make 工具调用的 shell)兼容的分隔符。例如,使用 Windows shell 时,斜线会转换为反斜线。

此函数在 Qt 5.0 中引入。

另请参阅system_path()

shell_quote(arg)

为构建项目时使用的 shell 引用arg

此函数在 Qt 5.0 中引入。

另请参阅system_quote()

size(variablename)

返回variablename 的值的个数。

另请参阅str_size()

sort_depends(variablename, prefix)

这是一个内部函数,您通常不需要它。

此函数在 Qt 5.0 中引入。

sorted(variablename)

返回variablename 中按 ASCII 升序排序的值列表。

数值排序可通过使用format_number()函数将数值填充为固定长度来实现。

该函数在 Qt 5.8 中引入。

split(variablename, separator)

variablename 的值分割成不同的值,并以列表形式返回。该函数是QString::split 的包装器。

例如

CONTACT = firstname:middlename:surname:phone
message($$split(CONTACT, :))

sprintf(string, arguments...)

用函数arguments 的逗号分隔列表中传递的参数替换string 中的 %1-%9,并返回处理后的字符串。

str_member(arg [, start [, end]])

该函数与member() 函数相同,不同之处在于它的操作对象是字符串值而不是列表变量,因此索引指的是字符位置。

该函数可用于实现许多常见的字符串切分操作:

# $$left(VAR, len)
left = $$str_member(VAR, 0, $$num_add($$len, -1))

# $$right(VAR, len)
right = $$str_member(VAR, -$$num, -1)

# $$mid(VAR, off, len)
mid = $$str_member(VAR, $$off, $$num_add($$off, $$len, -1))

# $$mid(VAR, off)
mid = $$str_member(VAR, $$off, -1)

# $$reverse(VAR)
reverse = $$str_member(VAR, -1, 0)

注意: 在这些实现中,需要单独处理len 参数为零的情况。

另请参阅member()num_add()

此函数在 Qt 5.8 中引入。

str_size(arg)

返回参数中的字符数。

另请参阅size()

此函数在 Qt 5.8 中引入。

system(command[, mode[, stsvar]])

您可以使用system 函数的这一变体,从命令中获取 stdout 并将其赋值给一个变量。

例如

UNAME = $$system(uname -s)
contains( UNAME, [lL]inux ):message( This looks like Linux ($$UNAME) to me )

$$cat()一样,mode 参数将blob,lines,true, 和false 作为值。不过,传统的分词规则(即空或true ,以及false )有细微差别。

如果通过stsvar ,命令的退出状态将存储在该变量中。如果命令崩溃,状态将是-1,否则将是一个由命令选择的非负退出代码。通常,将状态与零(成功)比较就足够了。

另请参见system() 的测试变量。

system_path(path)

path 中的所有目录分隔符转换为与system() 函数用于调用命令的 shell 兼容的分隔符。例如,对于 Windows shell,斜线会转换为反斜线。

此函数在 Qt 5.0 中引入。

另请参阅shell_path()

system_quote(arg)

system() 函数使用的 shell 引用arg

此函数在 Qt 5.0 中引入。

另请参阅shell_quote()

take_first(variablename)

返回variablename 的第一个值,并将其从源变量中删除。

这为实现队列等功能提供了方便。

此函数在 Qt 5.8 中引入。

另请参阅take_last()first()

take_last(variablename)

返回variablename 的最后一个值,并将其从源变量中删除。

这为实现堆栈等提供了方便。

此函数在 Qt 5.8 中引入。

另请参阅take_first()last()

unique(variablename)

返回variablename 中删除重复项后的值列表。例如

ARGS = 1 2 3 2 5 1
ARGS = $$unique(ARGS) #1 2 3 5

upper(arg1 [, arg2 ..., argn])

接收任意数量的参数并将其转换为大写。

另请参阅lower()

val_escape(variablename)

转义variablename 的值,使其能被解析为 qmake 代码。

此函数在 Qt 5.0 中引入。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.