我如何通过 CMake(qt5_wrap_ui) 指定 Qt Designer Form class 的文件名

How could I specify the file name of the Qt Designer Form class by CMake(qt5_wrap_ui)

以下是我正在使用的命令(automoc 不适用于 mu),效果很好

qt5_wrap_ui(import_dialog_ui ${HW_DATA_DIR}/import_dialog.ui)
qt5_wrap_ui(main_win_ui ${HW_DATA_DIR}/main_window.ui)
qt5_wrap_ui(user_list_ui ${HW_DATA_DIR}/user_list.ui)

项目布局

Project
  --incl
  --src
  --data(The path of HW_DATA_DIR)

问题是,原来的命令会生成文件名

  1. ui_import_dialog.h
  2. ui_main_window.h
  3. ui_user_list.h

但我想要的是

  1. import_dialog_ui.h
  2. main_window_ui.h
  3. user_list_ui.h

我如何通过 cmake 实现此目的?谢谢

好吧,如果你真的想更改 qt5_wrap_ui 函数的输出文件的名称,你可以制作一个自定义版本,它实际上是现有版本的副本。它位于 lib/cmake/Qt5Widgets/Qt5WidgetsMacros.cmake 下的 Qt 安装中,如下所示:

include(CMakeParseArguments)

# qt5_wrap_ui(outfiles inputfile ... )

function(QT5_WRAP_UI outfiles )
    set(options)
    set(oneValueArgs)
    set(multiValueArgs OPTIONS)

    cmake_parse_arguments(_WRAP_UI "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

    set(ui_files ${_WRAP_UI_UNPARSED_ARGUMENTS})
    set(ui_options ${_WRAP_UI_OPTIONS})

    foreach(it ${ui_files})
        get_filename_component(outfile ${it} NAME_WE)
        get_filename_component(infile ${it} ABSOLUTE)
        set(outfile ${CMAKE_CURRENT_BINARY_DIR}/ui_${outfile}.h)
        add_custom_command(OUTPUT ${outfile}
          COMMAND ${Qt5Widgets_UIC_EXECUTABLE}
          ARGS ${ui_options} -o ${outfile} ${infile}
          MAIN_DEPENDENCY ${infile} VERBATIM)
        list(APPEND ${outfiles} ${outfile})
    endforeach()
    set(${outfiles} ${${outfiles}} PARENT_SCOPE)
endfunction()

为此,从 Qt5WidgetsMacros.cmake 文件中获取代码并将其存储在另一个文件中,例如Qt5Customizations.cmake。您所要做的就是将函数名称重命名为突出您的自定义的名称:

function(QT5_WRAP_UI outfiles )

将其更改为例如:

function(QT5_WRAP_UI_CUSTOM outfiles )

并且您必须更改行,其中输出 ui 文件存储自:

set(outfile ${CMAKE_CURRENT_BINARY_DIR}/ui_${outfile}.h)

到 设置(输出文件 ${CMAKE_CURRENT_BINARY_DIR}/${输出文件}_ui.h)

如果您现在将自定义 CMake 脚本包含在项目的 CMake 脚本中:

include( Qt5Customizations )

您现在可以使用自定义函数:

qt5_wrap_ui_custom(import_dialog_ui ${HW_DATA_DIR}/import_dialog.ui)

并将生成的 ui 文件包含在

#include "import_dialog_ui.h"