第12章 替换函数
qmake提供了在配置过程中处理变量内容的功能。这些函数被称为替换函数。通常,它们会返回您可以分配给其他变量的值。您可以通过添加$$运算符前缀来获得这些值。替换函数可分为内置函数库和函数库。
另请参见测试函数。
内置替换函数
基本的替换函数被实现为内置函数。
absolute_path(path[, base])
返回path的绝对路径。
如果未指定基础目录,请使用当前目录作为基础目录。如果它是一个相对路径,则在使用之前将它相对于当前目录进行解析。
例如,下面的调用返回字符串“/home/johndoe/myproject/readme.txt”:
message($$absolute_path("readme.txt", "/home/johndoe/myproject"))
这个函数在Qt5.0中引入。
另请参见clean_path(),relative_path()。
basename(variablename)
返回在variablename中指定的文件的基名。
例如:
FILE = /etc/passwd
FILENAME = $$basename(FILE) #passwd
cat(filename[, mode])
返回filename的内容。您可以为mode指定以下选项:
Blob - 将文件的全部内容作为一个值返回
lines - 将每行作为单独的值返回(没有行结尾)
true(默认)和false - 文件内容作为单独的值返回,根据qmake值列表分割规则(如变量分配)进行分割。如果模式为false,则将只包含换行符的值插入到列表中,以指示文件中换行符的位置。
clean_path(path)
处理path,返回带规范化后的目录分隔符(转换为“/”)并删除冗余分隔符的路径,”.”和”..”也(尽可能)进行了处理。此函数包装了QDir::cleanPath。
这个函数在Qt5.0中引入。
另请参见absolute_path(),relative_path(),shell_path(),system_path()。
dirname(file)
返回指定文件的目录名部分。例如:
FILE = /etc/X11R6/XF86Config
DIRNAME = $$dirname(FILE) #/etc/X11R6
enumerate_vars
返回所有已定义的变量名的列表。
这个函数在Qt5.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为真,则此函数将下降到子目录。
first(variablename)
返回变量名的第一个值。
例如,以下调用返回名:
CONTACT = firstname middlename surname phone
message($$first(CONTACT))
另请参见take_first(),last()。
format_number(number[, options...])
以options指定的格式返回数字。您可以指定以下选项:
ibase=n设置输入的基数为n
obase=n将输出的基数设为n
width=n 将输出的最小宽度设置为n。如果输出小于width,则会用空格填充它
zeropad 用零而不是空格来填充输出
padsign 为输出中的正值添加空格
alwayssign 在输出中加加号
leftalign 将内边距放置在输出中的值的右侧
目前不支持浮点数。
例如,以下调用将十六进制数BAD转换为002989:
message($$format_number(BAD, ibase=16 width=6 zeropad))
这个函数在Qt5.0中引入。
fromfile(filename, variablename)
将filename视作qmake项目文件,并返回这个文件中的分配给variablename的值。
另请参见infile()。
getenv(variablename)
返回环境变量变量的值。这基本上相当于$$(variablename)语法。然而,getenv()支持在其名称中添加圆括号的环境变量。
这个函数在Qt5.12中引入。
join(variablename, glue, before, after)
用glue连接variablename的值。如果此值不是空,则此函数将before值作为前缀,after作为后缀。variablename是唯一需要的字段,其他字段默认为空字符串。如果您需要在glue、before或者after中加入空格,您必须把它们括起来。
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]])
返回包含start和end之间的索引(0起始)的variablename列表值的切片。
如果没有给start,则默认为零。这个用法相当于$$first(variablename)。
如果没有给出结束,则它默认为start。这个用法表示简单的数组索引,因为将只返回一个元素。
也可以在单个参数中指定开始和结束,并将数字用两个句点分隔。
负数表示从列表结尾开始的索引,-1是最后一个元素。
如果任一个索引超出范围,则返回一个空列表。
如果结束小于开始,则元素将按相反的顺序返回。
注:结束索引是包含和无序的,这意味着只有当索引无效时(输入变量是空的),才会返回空列表。
num_add(arg1[,arg2...,argn])
取任意数量的数字参数,并将它们相加,返回和。
减法被隐式地支持,因为可以简单地在一个数值前加一个负号:
sum = $$num_add($$first, -$$second)
如果操作数可能已经为负数,则需要另一个步骤来规范化这个数字:
second_neg = -$$second
second_neg ~= s/^--//
sum = $$num_add($$first, $$second_neg)
该函数在Qt5.8中引入。
prompt(question [, decorate])
显示指定的question,并返回从stdin中读取的值。
如果decorate是true(默认),问题将得到一个通用前缀和后缀,将其标识为提示。
quote(string)
将整个string转换为单个实体并返回结果。这只是一种将字符串封装为双引号的奇特方法。
re_escape(string)
返回包含使用反斜线转义的每个特殊正则表达式字符的string。这个函数包装了QRegExp::escape。
read_registry(tree, key[, flag])
返回树tree中注册表key的值。
只支持树HKEY_CURRENT_USER(HKCU)和HKEY_LOCAL_MACHINE(HKLM)。
该flag可以是WOW64_32KEY(32)或WOW64_64KEY(64)。
注:此功能仅在Windows主机上可用。
该函数在Qt5.12.1中引入。
relative_path(filePath[, base])
返回相对于base的filepath的路径。
如果未指定base,则它为当前的项目目录。如果它是相对的,则会相对于当前项目目录进行解析。
如果filePath是相对的,则首先根据base目录进行解析;在这种情况下,此函数有效地充当$$clean_path()。
这个函数在Qt5.0中引入。
另请参见absolute_path(),clean_path()。
replace(string, old_string, new_string)
在作为字符串提供的变量的内容中,用new_string替换old_string的每个实例。例如,代码
MESSAGE = This is a tent.
message($$replace(MESSAGE, tent, test))
会打印消息:
resolve_depends(variablename, prefix)
这是一个您通常不需要的内部函数。
这个函数在Qt5.0中引入。
reverse(variablename)
以反向顺序返回变量名称的值。
这个函数在Qt5.0中引入。
section(variablename, separator, begin, end)
返回variablename的值的一部分。这个函数包装了QString::section。
例如,以下调用输出surname:
CONTACT = firstname:middlename:surname:phone
message($$section(CONTACT, :, 2, 2))
shadowed(path)
将从项目源目录映射到构建目录的路径。此函数返回源代码内构建的路径。如果路径指向源树之外,则它将返回一个空字符串。
这个函数在Qt5.0中引入。
shell_path(path)
将path中的所有目录分隔符转换为与构建项目时使用的shell(即由make工具调用的shell)兼容的分隔符。例如,当使用Windows shell时,斜杠将被转换为反斜杠。
这个函数在Qt5.0中引入。
另请参见system_path()。
shell_quote(arg)
为构建项目时使用的shell引用arg。
这个函数在Qt5.0中引入。
另请参见system_quote()。
size(variablename)
返回变量名的值的数量。
另请参见str_size()。
sort_depends(variablename, prefix)
这是一个您通常不需要的内部函数。
这个函数在Qt5.0中引入。
sorted(variablename)
返回variablename中的值列表,其中包含按ASCII升序排序的条目。
数值排序可以通过借助format_number()函数将值零填充到固定长度来完成。
该函数在Qt5.8中引入。
split(variablename, separator)
将variablename的值分割为单独的值,并将它们作为一个列表返回。这个函数包装了QString::split()。
例如:
CONTACT = firstname:middlename:surname:phone
message($$split(CONTACT, :))
sprintf(string, arguments...)
将在以逗号分隔的函数参数列表中传递的参数替换字符串中的%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()。
该函数在Qt5.8中引入。
str_size(arg)
返回参数中的字符数。
另请参见size()。
该函数在Qt5.8中引入。
system(command[, mode[, stsvar]])
您可以使用系统函数的这个变体从命令中获取静态数据,并将其分配给一个变量。
例如:
UNAME = $$system(uname -s)
contains( UNAME, [lL]inux ):message( This looks like Linux ($$UNAME) to me )
与$$cat()一样,模式参数将blob、lines、true和false作为值。然而,传统的单词拆分规则(即空或true和false)有细微的差别。
如果传递stsvar,该命令的退出状态将存储在该变量中。如果命令崩溃,状态将为-1,否则为命令选择的非负退出代码。通常,将状态与零(成功)进行比较就足够了。
另请参见system()的测试变体。
system_path(path)
转换path内的所有目录分隔符为与system()函数用来调用命令的shell程序兼容的分隔符。例如,对于WindowsShell,斜杠会被转换为反斜杠。
这个函数在Qt5.0中引入。
另请参见shell_path()。
system_quote(arg)
引用system()函数所使用的shell的arg。
这个函数在Qt5.0中引入了。
take_first(variablename)
返回变量variablename的第一个值,并将其从源变量中删除。
例如,这为实现队列提供了便利。
该函数在Qt5.8中引入。
另请参见take_last(),first()。
take_last(variablename)
返回变量变量的最后一个值,并将其从源变量中删除。
例如,这为实现堆栈提供了便利。
该函数在Qt5.8中引入。
另请参见take_first(),last()。
unique(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代码的方式来逃避变量名的值。
这个函数在Qt5.0中引入。
最后更新于