FindQt4

查找 Qt4,一个用于创建图形用户界面和应用程序的跨平台应用程序开发框架。

find_package(Qt4 [<version>] [...])

此模块定义了许多导入目标、宏和变量,以便在项目中utables.

注意

此模块适用于 Qt 版本 4。对于 Qt 版本 5 及更高版本,Qt 上游也提供了用于查找 Qt 的导出配置。新代码应遵循 cmake-qt(7),而不是使用此模块。

要检测 Qt4 包,需要 Qt4 的 qmake 工具,并且该工具必须在系统路径中可用。

注意

在使用 导入目标 时,在 Windows 上会自动链接 qtmain.lib 静态库以用于 WIN32 可执行文件。要全局禁用此行为,请在查找 Qt4 之前设置 QT4_NO_LINK_QTMAIN 变量。要为特定可执行文件禁用此行为,请在该可执行文件上将 QT4_NO_LINK_QTMAIN 目标属性设置为 TRUE

Qt 构建工具

Qt 依赖于一些捆绑工具进行代码生成,例如用于元对象代码生成的 moc,用于小部件布局和填充的 uic,以及用于生成虚拟文件系统内容的 rcc。如果满足适当的条件,cmake(1) 可能会自动调用这些工具。有关更多信息,请参阅 cmake-qt(7)

导入的目标

可以使用相应的 导入目标target_link_libraries() 命令来链接 Qt 库。

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。

QT_FOUND

Qt4_FOUND 相同。一个布尔值,指示是否找到了(所请求版本的)Qt4。此变量是为了与其他 Qt 查找模块兼容而提供的。

QT_VERSION_MAJOR

找到的 Qt 的主版本号。

QT_VERSION_MINOR

找到的 Qt 的次版本号。

QT_VERSION_PATCH

找到的 Qt 的补丁版本号。

提示

QT4_NO_LINK_QTMAIN

如果在查找 Qt4 之前将其设置为布尔 true,则会全局禁用在 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_DIRECTORIESINTERFACE_COMPILE_DEFINITIONS 目标属性将被传递给 moc

OPTIONS

传递给 moc 的可选选项列表,例如执行 moc -help 时找到的选项。

注意

不要使用 qt4_wrap_cpp(),而是可以将 CMAKE_AUTOMOC 变量设置为自动处理 moc 的源文件。

qt4_wrap_ui

创建用于对给定的 Qt Designer UI 输入文件列表运行 uic 的构建规则。

qt4_wrap_ui(<variable> <files>... [OPTIONS <options>...])
<variable>

存储生成的文件名列表的变量名。

<files>

一个或多个 Qt Designer 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_DIRECTORIESINTERFACE_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>,则它将用作适配器本身的类名。生成的FILENAME存储在变量 <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.hfoo.cpp 文件,并且在 foo.h 中有一个类使用了 Q_OBJECT 预处理器宏,则必须在 foo.h 上运行 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_DIRECTORIESINTERFACE_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_PUBLICLINK_PRIVATE

可选的链接模式,用作 target_link_libraries() 调用中的相应参数。

例如,调用 qt4_use_modules(myexe Core Gui Declarative) 将在项目目标 myexe 上使用 QtCoreQtGuiQtDeclarative 组件。

已弃用变量

以下变量提供用于向后兼容性

QT4_FOUND

已弃用,版本 2.8.11 起: 使用 Qt4_FOUND,它具有相同的值。

示例

典型的查找 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)