在Python中,为什么要这个东东 __name__ == __main__

本文介绍了Python中main函数的特性,即直接执行脚本时main函数会被调用,而脚本被导入其他脚本时main函数会被忽略。还阐述了其用途,如文件可作为模块被其他程序调用,也能作为主程序运行,还可用于单元测试、提供API等。

One of those nice features of Python, that marks it as a language designed for developers (as opposed to one designed for tool vendors) is the ability to conditionally run some logic if you’re executing a script directly but ignore it if the script is being imported (“included”) by another script.

python 的main 方法是个很有意思的东东,如果你直接执行这个带有main的脚本,它会被调用。但是当这个脚本被import到其他的脚本的时候,main 会被忽略掉。惊奇不惊奇。

 

Why Does It Work This Way? 要这个东东干啥呢

You might naturally wonder why anybody would want this. Well, sometimes you want to write a .pyfile that can be both used by other programs and modules as a module and can be run as the main program. 

也许你会本能的猜测为什么会有人想要这个,有时候你写一个.py文件,它可以被其他程序和模块调用,有可以作为主程序运行。

  • Your module is a library, but you want to have a script mode where it runs some unit tests or a demo.

  • Your module is only used as a main program, but it has some unit tests, and the testing framework works by importing .py files like your script and running special test functions. You don't want it to try running the script just because it's importing the module.

  • Your module is mostly used as a main program, but it also provides a programmer-friendly API for advanced users.

<think> 我们正在讨论Qt6中如何调用uic生成ui_<basename>.h文件。根据之前的讨论,在Qt6中,推荐使用CMake的自动机制(AUTOUIC)或者显式使用qt_generate_ui命令。但是用户现在想了解具体的调用uic的方法,可能是想手动调用或者了解背后的原理。 在Qt6中,uic(用户界面编译器)仍然是存在的,它负责将.ui文件(XML格式)转换为C++头文件(ui_<basename>.h)。我们可以通过命令行手动调用uic,也可以在构建系统中配置(如CMake)自动调用。 下面我将介绍两种主要方法: ### 方法一:手动调用uic(命令行方式) 1. **找到uic工具**:在Qt安装目录下的bin文件夹中,例如: - Windows: `C:\Qt\6.5.0\msvc2019_64\bin\uic.exe` - Linux: `/opt/Qt/6.5.0/gcc_64/bin/uic` - macOS: `/Users/username/Qt/6.5.0/macos/bin/uic` 2. **命令行使用**: ```bash uic input.ui -o ui_output.h ``` 其中: - `input.ui`:输入的Qt Designer界面文件 - `ui_output.h`:生成的头文件(通常命名为`ui_<basename>.h`,例如`ui_mainwindow.h`) 注意:如果不指定输出文件,则uic会将结果输出到标准输出(控制台)。 3. **常用选项**: - `-o <file>`:指定输出文件 - `-g <language>`:指定目标语言(默认是C++,所以一般不用指定) - `--version`:显示版本信息 - `--help`:显示帮助信息 ### 方法二:通过CMake自动调用(推荐) 在CMake项目中,我们通常不手动调用uic,而是让CMake自动处理。有两种方式: #### 方式A:使用AUTOUIC(自动处理) 在CMakeLists.txt中启用AUTOUIC,并直接将.ui文件添加到可执行文件或库的源文件列表中: ```cmake cmake_minimum_required(VERSION 3.16) project(MyApp) find_package(Qt6 COMPONENTS Widgets REQUIRED) # 启用自动UIC set(CMAKE_AUTOUIC ON) # 添加可执行文件,包含.ui文件 add_executable(MyApp main.cpp mainwindow.cpp mainwindow.ui # 这里添加.ui文件 ) target_link_libraries(MyApp PRIVATE Qt6::Widgets) ``` CMake会在构建过程中自动调用uic,生成`ui_mainwindow.h`,并将其放在构建目录中(例如`build/CMakeFiles/MyApp.dir/ui_mainwindow.h`),同时会自动将该目录添加到头文件搜索路径中。 #### 方式B:显式使用qt_generate_ui 如果你想显式生成头文件,可以使用`qt_generate_ui`命令: ```cmake cmake_minimum_required(VERSION 3.16) project(MyApp) find_package(Qt6 COMPONENTS Widgets REQUIRED) # 显式生成UI头文件 qt_generate_ui(UI_HEADERS mainwindow.ui) add_executable(MyApp main.cpp mainwindow.cpp ${UI_HEADERS} # 添加生成的头文件 ) target_link_libraries(MyApp PRIVATE Qt6::Widgets) ``` 这样,`qt_generate_ui`会生成头文件(例如`ui_mainwindow.h`),并将其路径保存在变量`UI_HEADERS`中,然后将其添加到可执行文件的源文件中。 ### 方法三:使用qmake(Qt的传统构建工具) 虽然用户询问的是Qt6,但有时可能还在使用qmake。在qmake中,我们只需要在.pro文件中添加: ```qmake FORMS += mainwindow.ui ``` qmake会自动调用uic生成对应的头文件。 ### 生成文件的包含 在C++代码中,我们需要包含生成的头文件。例如,在`mainwindow.cpp`中: ```cpp #include "mainwindow.h" #include "ui_mainwindow.h" // 包含生成的头文件 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); } ``` ### 注意事项 1. **生成文件的位置**:在CMake中,生成的头文件位于构建目录中,因此不需要将其添加到版本控制中。 2. **依赖关系**:构建系统(CMake)会自动处理依赖关系,当.ui文件改变时,会自动重新生成头文件。 3. **多UI文件**:如果有多个.ui文件,可以一次添加到CMakeLists.txt中,例如: ```cmake file(GLOB UI_FILES "*.ui") qt_generate_ui(UI_HEADERS ${UI_FILES}) ``` ### 高级用法:自定义uic选项 如果需要传递特殊选项给uic,可以通过设置`AUTOUIC_OPTIONS`: ```cmake set(CMAKE_AUTOUIC_OPTIONS "--no-protection") # 例如,禁用头文件保护 ``` 或者在`qt_generate_ui`中传递: ```cmake qt_generate_ui(UI_HEADERS mainwindow.ui OPTIONS "--no-protection") ``` ### 原理说明 uic工具读取.ui文件(XML格式),然后根据模板生成C++代码。生成的类名通常为`Ui::<ClassName>`,其中`<ClassName>`是在Qt Designer中设置的对象名(即顶层窗口的`objectName`属性)。这个类包含所有界面元素的创建和布局代码。 ### 常见问题 1. **找不到uic**:确保Qt的bin目录在系统PATH环境变量中,或者在CMake中正确设置`Qt6_DIR`。 2. **编码问题**:如果.ui文件包含非ASCII字符(如中文),确保文件保存为UTF-8编码。 ### 总结 在Qt6中,生成`ui_<basename>.h`文件主要有两种方式: - **手动方式**:通过命令行调用uic工具。 - **自动方式**:通过构建系统(如CMake)自动调用(推荐)。 在CMake项目中,使用`AUTOUIC`或`qt_generate_ui`是最佳实践。 §§相关问题§§ 1. 如何在Qt6中自定义uic生成的代码? 2. 如何解决Qt6中uic生成的头文件路径问题? 3. 在非CMake项目(如Makefile)中如何集成uic? 4. Qt6的uic工具支持哪些新特性? </think>在 Qt6 中调用 `uic` 工具生成 `ui_<basename>.h` 文件主要有三种方法,以下是详细解决方案: ### 1. **使用 CMake 自动生成(推荐方法)** ```cmake cmake_minimum_required(VERSION 3.16) project(MyApp) # 启用 AUTOUIC(自动调用 uic) set(CMAKE_AUTOUIC ON) # 核心配置 [^2][^4] find_package(Qt6 COMPONENTS Widgets REQUIRED) # 添加 .ui 文件到可执行文件 add_executable(MyApp main.cpp mainwindow.cpp mainwindow.ui # 直接包含 .ui 文件 ) target_link_libraries(MyApp PRIVATE Qt6::Widgets) ``` - **原理**:CMake 自动检测 `.ui` 文件,调用 `uic` 生成 `ui_mainwindow.h` - **生成路径**:构建目录中(如 `build/CMakeFiles/MyApp.dir/ui_mainwindow.h`) - **包含方式**:在代码中直接 `#include "ui_mainwindow.h"` ### 2. **显式调用 qt_generate_ui** ```cmake find_package(Qt6 REQUIRED COMPONENTS Widgets) # 显式生成 UI 头文件 qt_generate_ui(UI_HEADERS mainwindow.ui # 输入 .ui 文件 OPTIONS "--no-protection" # 可选参数 ) add_executable(MyApp main.cpp ${UI_HEADERS}) target_link_libraries(MyApp PRIVATE Qt6::Widgets) ``` - **等价命令**:`qt_generate_ui` 替代了 Qt5 的 `qt5_wrap_ui` [^2] - **输出控制**:通过 `OUTPUT_DIRECTORY` 指定生成路径 ```cmake qt_generate_ui(UI_HEADERS mainwindow.ui OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/generated ) ``` ### 3. **手动命令行调用** ```bash # 查找 uic 路径(Qt安装目录下) $ which uic /opt/Qt/6.5.0/gcc_64/bin/uic # 手动生成头文件 $ uic mainwindow.ui -o ui_mainwindow.h # -o 指定输出文件 [^1] # 高级选项示例 $ uic mainwindow.ui \ --no-protection \ # 禁用头文件保护宏 -g cpp \ # 指定生成C++代码 -o ui_mainwindow.h ``` ### ⚙️ uic 常用参数说明 | 参数 | 作用 | 示例 | |------|------|------| | `-o <file>` | 指定输出文件 | `uic input.ui -o output.h` | | `--no-protection` | 禁用头文件保护宏 | `uic --no-protection input.ui` | | `-g <language>` | 指定输出语言 | `uic -g python input.ui` | | `--version` | 显示版本信息 | `uic --version` | | `--help` | 显示帮助文档 | `uic --help` | ### 🔧 常见问题解决 1. **uic 路径问题**: ```bash # 将 Qt bin 目录加入 PATH export PATH=/opt/Qt/6.5.0/gcc_64/bin:$PATH ``` 2. **编码问题处理**: ```cmake # 在 CMake 中指定 UTF-8 编码 set(CMAKE_AUTOUIC_OPTIONS "--input-encoding=UTF-8") [^1] ``` 3. **自定义生成规则**: ```cmake # 为特定文件设置生成选项 set_source_files_properties(mainwindow.ui PROPERTIES AUTOUIC_OPTIONS "--no-protection;--verbose" ) ``` ### 🔍 技术原理 Qt6 的 UI 编译流程: 1. **输入文件**:XML 格式的 `.ui` 文件(Qt Designer 创建) 2. **转换过程**:`uic` 解析 XML 并生成 C++ 代码 3. **输出结构**: ```cpp // ui_mainwindow.h 示例 class Ui_MainWindow { void setupUi(QMainWindow *parent) { // 自动生成的界面布局代码 } }; ``` 4. **代码集成**:在窗口类中通过 `Ui::MainWindow ui;` 访问 > **最佳实践**:在 Qt6 项目中推荐使用 `CMAKE_AUTOUIC` 自动处理机制,减少手动配置 [^2][^4]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值