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_DIRECTORIESINTERFACE_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_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>,则将其用作适配器本身的类名。生成的文件名存储在变量 <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 预处理器宏,则必须在其上运行 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 的典型用法可能如下所示

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)