FindQt4¶
此模块用于查找 Qt4,这是一个用于创建图形用户界面和应用程序的跨平台应用开发框架。它定义了许多导入目标、宏和变量,以便在项目中使用 Qt4。
注意
此模块适用于 Qt 4 版本。从 Qt 5 版本开始,Qt 上游也提供了导出配置来查找 Qt。新代码应遵循 cmake-qt(7)
,而不是使用此模块。
要检测 Qt4 包,需要 Qt4 qmake
工具,并且该工具必须在系统路径中可用。
注意
使用 导入目标 时,qtmain.lib
静态库在 Windows 上会自动链接到 WIN32
可执行文件。要全局禁用此功能,请在查找 Qt4 之前设置 QT4_NO_LINK_QTMAIN
变量。要为特定可执行文件禁用此功能,请在该可执行文件上将 QT4_NO_LINK_QTMAIN
目标属性设置为 TRUE
。
Qt 构建工具¶
Qt 依赖于一些捆绑工具进行代码生成,例如用于元对象代码生成的 moc
,用于小部件布局和填充的 uic
,以及用于虚拟文件系统内容生成的 rcc
。如果满足适当的条件,这些工具可能会由 cmake(1)
自动调用。有关更多信息,请参阅 cmake-qt(7)
。
导入的目标¶
Qt 库可以使用其对应的 导入目标 并通过 target_link_libraries()
命令进行链接
target_link_libraries(myexe Qt4::QtGui Qt4::QtXml)
链接到导入目标会在构建 myexe
时自动应用正确的包含目录和编译定义。
导入目标也管理它们的依赖关系,因此如果另一个 Qt 库依赖于 Qt4::QtCore
,则不需要列出它。同样,链接 Qt4::QtDeclarative
时会自动包含 Qt4::QtGui
。可以使用 if(TARGET)
命令检查目标是否存在。
如果 Qt 工具包库的调试版本和发布版本都可用,CMake 会根据 构建配置 选择适当的版本。
此模块提供以下导入目标(如果找到)
Qt4::QtCore
QtCore 目标
Qt4::QtGui
QtGui 目标
Qt4::Qt3Support
Qt3Support 目标
Qt4::QtAssistant
QtAssistant 目标
Qt4::QtAssistantClient
QtAssistantClient 目标
Qt4::QAxContainer
QAxContainer 目标(仅限 Windows)
Qt4::QAxServer
QAxServer 目标(仅限 Windows)
Qt4::QtDBus
QtDBus 目标
Qt4::QtDeclarative
QtDeclarative 目标
Qt4::QtDesigner
QtDesigner 目标
Qt4::QtDesignerComponents
QtDesignerComponents 目标
Qt4::QtHelp
QtHelp 目标
Qt4::QtMotif
QtMotif 目标
Qt4::QtMultimedia
QtMultimedia 目标
Qt4::QtNetwork
QtNetwork 目标
Qt4::QtNsPlugin
QtNsPlugin 目标
Qt4::QtOpenGL
QtOpenGL 目标
Qt4::QtScript
QtScript 目标
Qt4::QtScriptTools
QtScriptTools 目标
Qt4::QtSql
QtSql 目标
Qt4::QtSvg
QtSvg 目标
Qt4::QtTest
QtTest 目标
Qt4::QtUiTools
QtUiTools 目标
Qt4::QtWebKit
QtWebKit 目标
Qt4::QtXml
QtXml 目标
Qt4::QtXmlPatterns
QtXmlPatterns 目标
Qt4::phonon
phonon 目标
结果变量¶
此模块设置以下变量
Qt4_FOUND
布尔值,表示是否找到了 Qt4。如果为 false,则不要尝试使用 Qt4。
QT_FOUND
布尔值,表示是否找到了 Qt4。如果为 false,则不要尝试使用 Qt4。此变量用于与其他 Qt 查找模块兼容。
QT4_FOUND
布尔值,表示是否找到了 Qt4。如果为 false,则不要尝试使用 Qt4。此变量仅用于向后兼容。
QT_VERSION_MAJOR
找到的 Qt 的主版本号。
QT_VERSION_MINOR
找到的 Qt 的次版本号。
QT_VERSION_PATCH
找到的 Qt 的补丁版本号。
提示¶
QT4_NO_LINK_QTMAIN
如果在此模块查找 Qt4 之前设置为布尔真,则它会全局禁用在 Windows 上链接
qtmain.lib
静态库。
宏¶
在某些情况下,可能需要或有用以更手动的方式调用 Qt 构建工具。此模块提供以下宏来添加此类用途的目标
- qt4_wrap_cpp¶
为在给定输入文件列表上运行
moc
创建构建规则qt4_wrap_cpp(<variable> <files>... [TARGET <target>] [OPTIONS <options>...])
此宏为处理包含
Q_OBJECT
声明的 Qt 类输入文件列表<files>
创建构建规则。还会添加每个目录的预处理器定义。<variable>
存储生成的输出文件列表的变量名称。
<files>
一个或多个输入源文件。
TARGET
如果指定,来自
<target>
的INTERFACE_INCLUDE_DIRECTORIES
和INTERFACE_COMPILE_DEFINITIONS
目标属性将传递给moc
。OPTIONS
传递给
moc
的可选选项列表,例如执行moc -help
时找到的选项。
注意
除了使用
qt4_wrap_cpp()
之外,还可以设置CMAKE_AUTOMOC
变量以自动使用moc
处理源文件。
- qt4_wrap_ui¶
为在给定 Qt 设计器 ui 输入文件列表上运行
uic
创建构建规则qt4_wrap_ui(<variable> <files>... [OPTIONS <options>...])
<variable>
存储生成的输出文件名列表的变量名称。
<files>
一个或多个 Qt 设计器 ui 输入源文件。
OPTIONS
传递给
uic
的可选选项列表,例如执行uic -help
时找到的选项。
注意
除了使用
qt4_wrap_ui()
之外,还可以设置CMAKE_AUTOUIC
变量以自动使用uic
处理 UI 文件。
- qt4_add_resources¶
为在给定 Qt 资源输入文件列表上运行
rcc
创建构建规则qt4_add_resources(<variable> <files>... [OPTIONS <options>...])
<variable>
存储生成的输出文件名列表的变量名称。
<files>
一个或多个 Qt 资源输入源文件。
OPTIONS
传递给
rcc
的可选选项列表,例如执行rcc -help
时找到的选项。
注意
除了使用
qt4_add_resources()
之外,还可以设置CMAKE_AUTORCC
变量以自动使用rcc
处理资源文件。
- qt4_generate_moc¶
创建一个构建规则,通过在给定输入文件上运行
moc
来生成输出文件。qt4_generate_moc(<input-file> <output-file> [TARGET <target>])
此宏为
<input-file>
创建一个构建规则,以生成<output-file>
。如果由于某种原因qt4_wrap_cpp()
不可行,例如因为 moc 文件需要自定义文件名或类似情况,则使用此宏。TARGET
如果指定,来自
<target>
的INTERFACE_INCLUDE_DIRECTORIES
和INTERFACE_COMPILE_DEFINITIONS
目标属性将传递给moc
。
- qt4_add_dbus_interface¶
从接口 XML 文件创建接口头文件和实现文件
qt4_add_dbus_interface(<variable> <interface-file> <basename>)
此宏从给定的接口 XML 文件
<interface-file>
创建接口头文件 (<basename>.h
) 和实现文件 (<basename>.{cpp,moc}
),并将其添加到包含源列表的变量中(指定为变量名<variable>
)。通过在输入文件
<interface-file>
上设置以下源文件属性,可以将其他参数传递给qdbusxml2cpp
调用INCLUDE
给定文件将包含在生成的接口头文件中。
CLASSNAME
生成类的名称。
NO_NAMESPACE
生成的类将不被命名空间包装。
- qt4_add_dbus_interfaces¶
从多个接口 XML 文件创建接口头文件和实现文件
qt4_add_dbus_interfaces(<variable> <interface-files>...)
此宏为所有列出的接口 XML 文件
<interface-files>
创建接口头文件和实现文件。基本名称将自动从 XML 文件的名称中确定。生成的输出文件列表存储在变量<variable>
中。为
qt4_add_dbus_interface()
描述的源文件属性也适用于此处。
- qt4_add_dbus_adaptor¶
为 D-Bus 接口生成适配器类
qt4_add_dbus_adaptor(<variable> <xmlfile> <parent-header> <parent-classname> [<basename>] [<classname>])
从描述接口的 XML 文件创建一个 D-Bus 适配器(头文件和实现文件),并将其添加到源列表。适配器将调用转发到在
<parent-header>
中定义并命名为<parent-classname>
的父类。生成的 文件名将为<basename>adaptor.{cpp,h}
,其中<basename>
默认为 XML 文件的基本名(如果未给出)。如果提供了<classname>
,则将其用作适配器本身的类名。生成的文件名存储在变量<variable>
中。
- qt4_generate_dbus_interface¶
从给定头文件生成 D-Bus XML 接口文件
qt4_generate_dbus_interface(<header> [<interface>] [OPTIONS <options>...])
此宏创建一个构建规则,从给定
<header>
文件中提取声明,以生成相应的 XML 接口文件。<header>
生成 XML 接口文件的头文件路径。
<interface>
生成的 XML 接口文件的路径。如果省略此可选参数,接口文件的名称将由头文件的基本名称加上后缀
.xml
构成。相对路径将被解释为相对于CMAKE_CURRENT_BINARY_DIR
。OPTIONS
可传递给
qdbuscpp2xml
的选项列表,例如执行qdbuscpp2xml --help
时找到的选项。
- qt4_create_translation¶
创建生成 TS 和 QM 文件的构建规则
qt4_create_translation(<qm-files-var> <directories>... <sources>... <ts-files>... [OPTIONS <options>...])
此宏创建构建规则,用于通过
lupdate
生成 TS(翻译源文件.ts
)文件,并通过lrelease
从给定<directories>
和/或<sources>
生成 QM(Qt 消息文件.qm
)文件。TS 文件在源树中创建和/或更新(除非给出完整路径)。QM 文件在构建树中生成。<qm-files-var>
生成的 QM 文件列表存储在此变量中。更新翻译可以通过将
<qm-files-var>
添加到项目库/可执行文件的源列表来完成,以便它们始终更新,或者通过添加自定义目标来控制何时更新/生成它们。<directories>
包含源文件的目录列表。
<sources>
源文件列表。
<ts-files>
TS(翻译源)文件列表。
OPTIONS
传递给
lupdate
的可选标志列表,例如-extensions
,用于指定目录扫描的文件扩展名。
- qt4_add_translation¶
为从给定 TS 文件生成 QM 文件创建构建规则
qt4_add_translation(<qm-files-var> <ts-files>...)
此宏为从给定 TS 文件生成 QM 文件创建构建规则,并将生成的 QM 文件名列表存储在
<qm-files-var>
变量中。<ts-files>
必须存在,并且不会以任何方式更新。
- qt4_automoc¶
自版本 2.8.11 起已弃用: 请改用
CMAKE_AUTOMOC
变量提供的功能。在输入文件上运行
moc
qt4_automoc(<source-files>... [TARGET <target>])
此宏可用于自动处理
moc
。例如,如果存在foo.h
和foo.cpp
文件,并且在foo.h
中,某个类使用了Q_OBJECT
预处理器宏,则必须在其上运行moc
。如果不想使用qt4_wrap_cpp()
(尽管它可靠且成熟),则可以将#include "foo.moc"
插入到foo.cpp
中,然后将foo.cpp
作为参数传递给qt4_automoc()
。这将扫描配置阶段列出的所有文件<source-files>
以查找此类包含的 moc 文件,如果找到它们,则会生成一条规则,以便在构建时在配套头文件foo.h
上运行 moc。如果源文件设置了SKIP_AUTOMOC
属性,则此宏将忽略该文件。TARGET
如果指定,来自
<target>
的INTERFACE_INCLUDE_DIRECTORIES
和INTERFACE_COMPILE_DEFINITIONS
目标属性将传递给moc
。
- qt4_use_modules¶
自版本 2.8.11 起已弃用: 请改用
target_link_libraries()
和 导入目标。为项目提供 Qt 模块以将其链接到目标
qt4_use_modules(<target> [<LINK_PUBLIC|LINK_PRIVATE>] <modules>...)
此函数使
<target>
使用 Qt 中的<modules>
。使用 Qt 模块意味着链接到库,添加模块的相关包含目录,并添加使用模块的相关编译器定义。模块大致等同于 Qt4 组件。LINK_PUBLIC
或LINK_PRIVATE
可选的链接模式,用作
target_link_libraries()
调用中的相应参数。
例如,调用
qt4_use_modules(myexe Core Gui Declarative)
将在项目目标myexe
上使用QtCore
、QtGui
和QtDeclarative
组件。
示例¶
查找 Qt4 的典型用法可能如下所示
set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
find_package(Qt4 4.4.3 REQUIRED QtGui QtXml)
add_executable(myexe main.cpp)
target_link_libraries(myexe PRIVATE Qt4::QtGui Qt4::QtXml)