Qt Designer 入门教程:零基础掌握强大的可视化界面设计工具
欢迎来到 Qt GUI 应用程序开发的世界!如果你刚刚接触 Qt,或者厌倦了纯代码手写界面布局,那么 Qt Designer 将是你的得力助手。它是一个强大的可视化界面设计工具,让你能够通过拖拽、点击的方式快速构建出应用程序的用户界面(UI),大大提高开发效率。
本教程将带你从零开始认识并使用 Qt Designer,学习如何创建窗体、添加控件、使用布局管理器以及最重要的——如何在你的代码中使用设计好的 .ui
文件。
什么是 Qt Designer?
Qt Designer 是 Qt 框架提供的一个图形用户界面(GUI)设计工具。它允许开发者以可视化方式创建和编辑基于 Qt 的界面窗体,而无需手写大量界面布局代码。
为什么使用 Qt Designer?
- 所见即所得 (WYSIWYG): 你在 Designer 中看到的就是程序运行时界面的大致样子,直观方便。
- 提高效率: 通过拖拽和设置属性,可以快速搭建复杂的界面结构,比手写代码快得多。
- 分离界面与逻辑: 将界面的布局和外观设计(
.ui
文件)与应用程序的业务逻辑(代码)分开,使得项目结构更清晰,维护更容易。UI 设计师和开发者可以更有效地协作。 - 强大的布局管理: Qt 的布局管理器非常强大,Designer 提供了方便的可视化方式来应用和配置这些布局,确保界面在不同大小的窗口下都能良好显示。
如何获取并启动 Qt Designer?
Qt Designer 通常作为 Qt 安装的一部分提供。
- 如果你安装了 Qt Creator (Qt 的集成开发环境): Designer 通常集成在 Qt Creator 中,或者作为独立应用程序安装在 Qt 安装目录下的
bin
文件夹中。在 Windows 上,你可以在开始菜单中找到它,例如 “Qt 5.x.x” -> “Qt Designer”。在 macOS 或 Linux 上,可以在 Qt 安装目录的bin
文件夹找到并运行designer
可执行文件。 - 如果你只安装了 Qt 库: 需要确保安装时包含了 Tools 组件,Designer 也会在
bin
目录下。
启动 Qt Designer 后,你将看到一个欢迎界面,可以选择创建新窗体或打开现有文件。
初识 Qt Designer 界面
第一次启动 Qt Designer,或者选择 “文件 -> 新建” (File -> New) 时,会弹出一个“新建窗体” (New Form) 对话框。这里提供了几种常用的窗体模板:
- Main Window (主窗口): 带有菜单栏、工具栏、状态栏和中心区域的标准应用程序主窗口。适合开发功能齐全的桌面应用。
- Dialog (对话框): 用于弹出消息、获取用户输入等的独立小窗口。通常有 OK/Cancel 按钮。
- Widget (控件): 一个空白的基础控件,可以作为独立的窗口,或者嵌入到其他窗体中。适合设计自定义的复合控件。
- Other Forms: 包含了一些其他特定用途的模板,如基于模板的对话框等。
选择一个模板,比如 “Main Window”,然后点击 “创建” (Create),你就会看到 Qt Designer 的主界面。
Qt Designer 的界面主要由以下几个区域组成:
- 中央画布 (Form Editor): 这是工作区的主体,你将在这里拖放控件,设计窗体的布局和外观。所见即所得的效果主要体现在这里。
- 控件箱 (Widget Box): 通常位于窗口的左侧。这里列出了 Qt 提供的各种标准控件(Widgets),例如按钮 (Push Button)、标签 (Label)、文本框 (Line Edit)、复选框 (Check Box)、单选按钮 (Radio Button)、各种布局管理器 (Layouts) 等等。你可以直接从这里将控件拖拽到中央画布上。
- 对象查看器 (Object Inspector): 通常位于窗口的右上角。它以树状结构显示当前窗体上所有控件的层级关系。每个控件都有一个唯一的“对象名称” (objectName),这个名称非常重要,因为它是在代码中引用该控件的标识符。你可以通过双击这里的名称来修改它。
- 属性编辑器 (Property Editor): 通常位于对象查看器的下方。当你选中中央画布或对象查看器中的某个控件时,属性编辑器会显示该控件的所有可配置属性。你可以通过修改这些属性来改变控件的文本、大小、颜色、字体、是否可见、是否启用等等外观和行为。这是定制控件样式的关键区域。
- 信号槽编辑器 (Signal/Slot Editor): 通常是一个独立的面板或标签页。Qt 使用信号槽机制处理事件。这个编辑器可以用来查看和创建简单的信号槽连接,尽管复杂的信号槽连接通常在代码中完成。
- 动作编辑器 (Action Editor): 用于创建和管理用于菜单栏和工具栏的“动作”(Action)。一个动作可以代表一个操作,例如“新建文件”、“保存”等,它可以同时在菜单项、工具栏按钮和快捷键中关联。
创建你的第一个窗体:一个简单的登录界面
让我们通过创建一个简单的登录界面来实践一下。
- 创建新窗体: 启动 Qt Designer,选择 “新建窗体”,然后选择 “Widget” 模板(我们创建一个简单的面板,不带菜单栏等)。点击 “创建”。
- 添加控件:
- 从“控件箱”中找到 “Label” (标签) 控件,拖拽到画布上。再拖拽一个。
- 找到 “Line Edit” (单行输入框) 控件,拖拽两个到画布上。
- 找到 “Push Button” (按钮) 控件,拖拽两个到画布上。
-
安排控件位置 (初步): 随意将这些控件拖动到画布上,大致排列成以下结构:
标签1 (用户名) 输入框1
标签2 (密码) 输入框2
按钮1 (登录) 按钮2 (取消)
注意: 这时候的布局是“绝对布局”,控件的位置是固定的像素坐标。当你改变窗口大小时,这些控件的位置不会随之调整,可能会出现重叠或空白。这正是我们需要布局管理器的原因。 -
修改控件属性: 选中画布上的每个控件,然后在“属性编辑器”中修改其属性:
- 标签1:
objectName
:label_username
text
:用户名:
- 标签2:
objectName
:label_password
text
:密 码:
- 输入框1:
objectName
:lineEdit_username
- 输入框2:
objectName
:lineEdit_password
echoMode
(在QLineEdit
分组下): 选择Password
,这样输入的密码会显示为星号。
- 按钮1:
objectName
:pushButton_login
text
:登录
- 按钮2:
objectName
:pushButton_cancel
text
:取消
现在,你的界面看起来差不多了,但布局仍然是乱的。
- 标签1:
使用布局管理器 (Layouts) – 核心技能!
布局管理器是 Qt GUI 编程的核心之一,也是 Qt Designer 的强大之处。它们可以自动调整控件的大小和位置,以适应窗体大小的变化,使得界面具有响应性。
常用的布局管理器有:
- Horizontal Layout (水平布局 – QHBoxLayout): 将控件沿水平方向排列。
- Vertical Layout (垂直布局 – QVBoxLayout): 将控件沿垂直方向排列。
- Grid Layout (栅格布局 – QGridLayout): 将控件放入一个网格中,按行和列排列。
- Form Layout (表单布局 – QFormLayout): 专门用于创建“标签-输入框”对的表单界面。
我们的登录界面非常适合使用栅格布局或表单布局。我们先尝试使用表单布局和水平布局的组合。
-
应用表单布局:
- 选中
label_username
,lineEdit_username
,label_password
,lineEdit_password
这四个控件(可以通过按住 Ctrl 或 Shift 键点击选中多个)。 - 在菜单栏选择 “窗体 (Form)” -> “按布局排列 (Lay Out)” -> “按表单布局 (Lay Out in Form Layout)”。或者在工具栏找到表单布局的图标并点击。
- 这四个控件会被组织到一个 QFormLayout 中,标签在左边,输入框在右边,并且它们会自动对齐。
- 选中
-
应用水平布局到按钮:
- 选中
pushButton_login
和pushButton_cancel
这两个按钮。 - 在菜单栏选择 “窗体 (Form)” -> “按布局排列 (Lay Out)” -> “按水平布局 (Lay Out in Horizontal Layout)”。或者点击水平布局图标。
- 这两个按钮会被组织到一个 QHBoxLayout 中,水平排列。
- 选中
-
组合所有布局 (垂直布局):
- 现在画布上有两个主要的“布局单元”:上面的 QFormLayout (包含标签和输入框) 和下面的 QHBoxLayout (包含两个按钮)。
- 选中整个窗体。最简单的方法是点击窗体背景的空白区域,或者在“对象查看器”中点击顶层的对象(通常是
Widget
或MainWindow
)。 - 在菜单栏选择 “窗体 (Form)” -> “按布局排列 (Lay Out)” -> “按垂直布局 (Lay Out in Vertical Layout)”。或者点击垂直布局图标。
- 现在,窗体上的两个布局单元(Form Layout 和 Horizontal Layout)会被垂直排列。
你可能还需要调整:
* 弹簧 (Spacer): 在“控件箱”的 “Spacers” 分组下有 “Horizontal Spacer” 和 “Vertical Spacer”。弹簧会占据布局中的可用空间并尽量扩张,常用于将控件推向一侧或在控件之间创建可伸缩的空白。例如,在登录和取消按钮之间或旁边添加水平弹簧,可以控制按钮的位置或间距。
* 布局的属性: 选中画布上的布局(点击控件之间的空白区域或在对象查看器中选中对应的 Layout 对象),可以在属性编辑器中调整布局的spacing
(控件间距) 和contentsMargins
(布局与边界的间距)。通过合理使用布局管理器和弹簧,你的界面将变得整洁有序,并且无论如何拉伸窗口,控件都会自动调整大小和位置以填充可用空间。
调整控件属性 (进阶)
在属性编辑器中,你可以调整控件的各种属性:
- 几何属性 (Geometry):
geometry
(位置和大小)、minimumSize
(最小尺寸)、maximumSize
(最大尺寸)、sizePolicy
(尺寸策略,非常重要,控制控件在布局中如何伸展和收缩)。 - 外观属性:
windowTitle
(窗口标题,对顶层窗体有效)、font
(字体)、styleSheet
(CSS 样式表,可以用来美化控件)、icon
(图标,对按钮、标签等有效)。 - 状态属性:
enabled
(是否启用)、visible
(是否可见)、checkable
(是否可勾选,对按钮等有效)。 - 特定控件属性: 例如
QLineEdit
的placeholderText
(占位符文本)、maxLength
(最大长度);QLabel
的wordWrap
(自动换行)。
花些时间在属性编辑器中探索,你会发现很多有用的选项。记住,objectName
是你在代码中引用这个控件的唯一标识,务必给控件起一个有意义且易于区分的名称。
信号与槽 (在 Designer 中的体现)
Qt 的信号槽机制是对象之间通信的方式。当一个事件发生时(例如按钮被点击),会发出一个“信号” (Signal)。对这个信号感兴趣的对象可以连接一个“槽” (Slot) 来响应它(槽就是一个函数或方法)。
虽然复杂的信号槽连接主要在代码中完成,但 Qt Designer 也提供了一些可视化帮助:
- 信号槽编辑器 (Signal/Slot Editor): 你可以在这里查看当前窗体中已有的信号槽连接。你可以通过点击工具栏上的“编辑信号/槽” (Edit Signals/Slots) 按钮进入编辑模式(窗体上会出现红色的箭头),然后从发出信号的控件拖拽到接收信号的控件上,选择信号和槽进行连接。这种方式适用于一些简单的、标准控件的标准信号连接,例如按钮的
clicked()
信号连接到窗口的close()
槽。 - 属性编辑器中的信号和槽: 在属性编辑器底部,有时会看到
signals
和slots
分组。你可以在这里给自定义的控件添加新的信号或槽的声明(虽然这更多是在自定义控件类定义中完成,Designer 只是一个可视化工具)。
对于初学者,更重要的是理解:Qt Designer 主要用来设计界面的“静态”布局和外观,以及定义控件的 objectName
。信号槽连接以及更复杂的业务逻辑通常在代码中实现,通过 objectName
来获取控件的引用。
预览你的设计
在设计过程中,你可以随时预览界面的效果。选择菜单栏的 “窗体 (Form)” -> “预览 (Preview)”。弹出的窗口会显示你的界面在实际运行时的样子,包括布局管理器的工作效果。这是检查布局和外观是否符合预期的重要步骤。
保存 .ui
文件
完成界面设计后,选择 “文件 (File)” -> “保存” (Save) 或 “另存为” (Save As)。Qt Designer 会将你的设计保存为一个 .ui
后缀的文件。这是一个 XML 格式的文件,里面描述了窗体上所有控件的类型、属性、层级关系和布局信息。
这个 .ui
文件本身并不能直接运行,它只是界面的“蓝图”。你需要用编程语言(如 Python 或 C++)来加载并使用这个文件。
在你的代码中使用 .ui
文件
这是将设计好的界面变成可运行程序的最关键一步。有几种方式可以使用 .ui
文件:
方法一:动态加载 .ui
文件 (Python/PyQt/PySide)
这种方法直接在程序运行时读取并解析 .ui
文件来创建界面。
“`python
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.uic import loadUi
class MyLoginForm(QWidget):
def init(self):
super().init()
# 加载 .ui 文件
loadUi(“login_form.ui”, self) # “login_form.ui” 是你保存的 .ui 文件名
# 现在你可以通过 objectName 来访问 .ui 中设计的控件了
# 例如: self.lineEdit_username, self.pushButton_login
# 连接信号和槽 (在代码中实现业务逻辑)
self.pushButton_login.clicked.connect(self.handle_login)
self.pushButton_cancel.clicked.connect(self.handle_cancel)
def handle_login(self):
username = self.lineEdit_username.text()
password = self.lineEdit_password.text()
print(f"尝试登录: 用户名={username}, 密码={password}")
# 这里可以添加你的登录验证逻辑
def handle_cancel(self):
print("取消登录")
self.close() # 关闭窗口
if name == “main“:
app = QApplication(sys.argv)
main_window = MyLoginForm()
main_window.show()
sys.exit(app.exec_())
``
.ui
*优点:* 修改文件后无需重新生成代码,即时生效。
.ui
*缺点:* 运行时需要解析文件,效率略低于直接运行代码。需要在代码中显式地调用
loadUi`。
方法二:将 .ui
文件转换成 Python 代码 (pyuic
)
Qt 提供了 pyuic
工具(对于 PyQt5 是 pyuic5
,对于 PyQt6 是 pyuic6
,对于 PySide2 是 pyside2-uic
,对于 PySide6 是 pyside6-uic
),可以将 .ui
文件转换成一个 Python 模块。
转换步骤:
打开命令行或终端,进入你的 .ui
文件所在的目录,然后运行以下命令:
“`bash
对于 PyQt5
pyuic5 -x login_form.ui -o ui_login_form.py
对于 PyQt6
pyuic6 -x login_form.ui -o ui_login_form.py
对于 PySide2
pyside2-uic -x login_form.ui -o ui_login_form.py
对于 PySide6
pyside6-uic -x login_form.ui -o ui_login_form.py
“`
-x
: 生成的代码会包含一个简单的测试运行代码块 (if __name__ == "__main__":
)。login_form.ui
: 你设计的.ui
文件名。-o ui_login_form.py
: 输出的 Python 文件名。通常以ui_
开头以示区别。
运行命令后,会生成一个 ui_login_form.py
文件。打开它,你会看到一个 Python 类(通常叫做 Ui_Widget
如果你创建的是 Widget 模板),里面包含了创建和设置你在 Designer 中添加的所有控件及其属性的代码,以及应用布局的代码。
使用生成的 Python 代码:
在另一个 Python 文件(例如 main.py
)中导入并使用这个生成的类:
“`python
import sys
from PyQt5.QtWidgets import QApplication, QWidget
导入生成的 UI 文件中的类
from ui_login_form import Ui_Widget # 注意类名,可能因模板而异,通常是 Ui_窗体类型名
class MyLoginForm(QWidget, Ui_Widget): # 继承 QWidget 和生成的 Ui 类
def init(self):
super().init()
# 调用 setupUi 方法来创建和布置界面
self.setupUi(self)
# 现在 self 就是你的窗体,并且包含了所有 ui_login_form.py 中创建的控件
# 你可以直接通过 self.objectName 来访问控件
# 例如: self.lineEdit_username, self.pushButton_login
# 连接信号和槽 (在代码中实现业务逻辑)
self.pushButton_login.clicked.connect(self.handle_login)
self.pushButton_cancel.clicked.connect(self.handle_cancel)
def handle_login(self):
username = self.lineEdit_username.text()
password = self.lineEdit_password.text()
print(f"尝试登录: 用户名={username}, 密码={password}")
# 这里可以添加你的登录验证逻辑
def handle_cancel(self):
print("取消登录")
self.close() # 关闭窗口
if name == “main“:
app = QApplication(sys.argv)
main_window = MyLoginForm()
main_window.show()
sys.exit(app.exec_())
``
.ui
*优点:* 运行时效率高,因为界面是直接由 Python 代码创建的。将界面定义和业务逻辑分离得更清晰。
*缺点:* 每次修改文件后,都需要重新运行
pyuic命令生成
.py` 文件。
对于 C++ 项目:
C++ 项目使用 uic
工具将 .ui
文件编译成 C++ 头文件(例如 ui_mainwindow.h
),然后在你的 C++ 类中包含这个头文件并使用其中的类来设置界面。原理与 Python 的 pyuic
类似。
选择哪种方式取决于个人偏好和项目需求。对于初学者和中小型项目,使用 pyuic
转换成代码可能是更常见和易于管理的方式。
使用 Qt Designer 的优势总结
通过本教程的学习,你应该能体会到 Qt Designer 的强大之处:
- 可视化编辑: 摆脱繁琐的手写布局代码,通过拖拽、点击、设置属性即可完成界面设计。
- 快速原型开发: 可以快速搭建界面的原型,与客户或团队成员沟通确认。
- 自动化布局: 布局管理器帮你处理窗口大小变化时的控件位置和尺寸调整。
- 分离关注点:
.ui
文件负责界面,.py
(或.cpp
) 文件负责逻辑,代码结构更清晰。
局限性
虽然强大,但 Qt Designer 也有其局限性:
- 动态生成的界面元素: 如果你需要根据运行时数据动态创建大量控件,或者界面的结构是高度动态变化的,可能需要在代码中实现。
- 复杂的自定义控件: 虽然可以在 Designer 中使用自定义控件(如果你的项目包含了它们),但设计自定义控件本身通常需要在代码中完成。
- 复杂的信号槽连接: 大多数有实际业务逻辑的信号槽连接(例如将按钮点击连接到数据库操作函数)需要在代码中编写。
- 高度自定义绘图: 涉及 QPainter 的自定义绘图通常需要在代码中实现。
结论
Qt Designer 是学习和使用 Qt GUI 的一个绝佳起点。它让你能够快速上手创建具有专业外观的用户界面,并将精力更多地放在实现核心的应用程序功能上。
通过本教程,你已经学会了:
- 启动和认识 Qt Designer 的界面。
- 添加和修改控件。
- 运用强大的布局管理器使界面具有响应性。
- 保存
.ui
文件。 - 以及最关键的——如何在 Python 代码中加载或使用由
.ui
文件转换而来的界面。
现在,是时候打开 Qt Designer,多多实践,尝试创建各种不同布局的界面。结合编程语言实现信号槽连接和业务逻辑,你就能开发出功能完善的 Qt GUI 应用程序了!祝你编程愉快!