用PYQT和QT Designer创建GUI程序
### 使用PYQT和QT Designer创建GUI程序 #### 1. Qt、PyQt和Qt Designer是什么? **Qt** 是一个跨平台的应用程序框架,主要用于开发图形用户界面(GUI)应用程序,但也可以用于非GUI应用程序。Qt 支持多种操作系统,包括 Windows、macOS、Linux 以及其他 Unix 平台。Qt 提供了丰富的类库来处理窗口系统集成、文件系统、网络协议等,并且具有强大的图形渲染引擎。Qt 采用双重授权模式:一方面可以在 GNU GPL 许可下免费使用;另一方面,对于需要闭源发布的商业应用,则可以选择购买商业许可证。 **PyQt** 是一组 Python 绑定库,它使得 Python 开发者能够利用 Qt 框架来开发应用程序。PyQt 提供了对 Qt 类库全面的 API 支持,这意味着几乎所有 Qt 的功能都可以在 Python 中使用。与 Qt 类似,PyQt 也采用了双重授权方式:开发者可以根据自己的需求选择 GPL 版本或是商业版本。PyQt 社区活跃,有一个专门的邮件列表和 Wiki 网站提供技术支持和交流。 **Qt Designer** 是一个图形界面设计工具,主要用于设计 Qt 应用程序的用户界面。Qt Designer 不仅仅是一个集成开发环境(IDE),它专注于界面设计,提供了实时预览功能,并能够生成 XML 描述文件。开发者可以通过 pyuic4 工具将这些 XML 文件转换成 Python 代码,或者使用 Python 的 uic 模块在运行时动态生成界面。 #### 2. PyQt 基础 **Widgets 和 Layouts** PyQt 提供了大量的 Widgets(小部件),如按钮、文本框、列表等,以及各种布局管理器,如 QVBoxLayout、HBoxLayout 等,这些部件和布局可以用来构建复杂的用户界面。 **Signals 和 Slots** PyQt 中的 Widgets 可以发射信号(Signal),这些信号可以被其他 Widgets 的槽函数(Slot)所捕获。这种机制允许 Widgets 之间互相通信,实现事件驱动的编程模型。 #### 3. 一个简单的示例 假设我们正在创建一个简单的 PyPI 信息查询工具,该工具可以从 PyPI 网站检索包的信息。 **创建表单** 首先使用 Qt Designer 设计一个包含搜索按钮、下拉列表和树形视图的表单。在 Qt Designer 中完成设计后,可以导出一个名为 `ui_window.py` 的 Python 文件,其中包含了生成的 UI 代码。 **编写应用逻辑** 接下来,在 Python 中编写主程序。例如: ```python from PyQt4.QtCore import Qt, SIGNAL from PyQt4.QtGui import * from ui_window import Ui_Window import pypi class Window(QWidget, Ui_Window): terms = ["name", "version", "author", "author_email", "maintainer", "maintainer_email", "home_page", "license", "summary", "description", "keywords", "platform", "download_url"] def __init__(self, parent=None): QWidget.__init__(self, parent) self.setupUi(self) self.connect(self.searchButton, SIGNAL("clicked()"), self.search) def search(self): self.treeWidget.clear() qApp.setOverrideCursor(Qt.WaitCursor) server = pypi.PackageServer("http://pypi.python.org/pypi") matches = server.search({unicode(self.terms[self.fieldComboBox.currentIndex()]): unicode(self.lineEdit.text())}) for match in matches: item = QTreeWidgetItem(self.treeWidget) item.setText(0, match["name"]) item.setText(1, match["version"]) ``` **运行应用** 运行上面的 Python 程序,即可看到一个具备搜索功能的图形界面。 在这个示例中,我们首先定义了一个继承自 `QWidget` 和 `Ui_Window` 的类 `Window`。`Ui_Window` 类是由 Qt Designer 自动生成的。在构造函数 `__init__` 中,我们调用了 `setupUi(self)` 来初始化 UI,并连接了搜索按钮的点击事件到 `search` 方法。当用户点击搜索按钮时,会执行 `search` 方法中的逻辑,从 PyPI 获取匹配的数据,并将其显示在树形视图中。 #### 4. 更实用的例子 在更复杂的应用程序中,可能还需要考虑使用 Actions 和 Resources 来增强程序的功能性,同时利用自动信号槽连接来简化编码工作。 **Actions 和 Resources** Actions 是 Qt 中的一种特殊 Widget,它们可以用于菜单项、工具栏按钮等,通常与信号槽机制配合使用。Resources 则是一种用于存储应用程序资源(如图像文件、样式表等)的方式。 **自动信号槽连接** 在 Qt Designer 中设计界面时,可以直接指定控件的信号与另一个控件的槽之间的连接关系,这样在运行时,就不需要手动编写代码来实现信号槽的连接,大大简化了开发过程。 #### 5. 自定义 Widgets 除了使用 Qt 提供的标准 Widgets 外,开发者还可以根据需要自定义 Widgets,以满足特定的应用需求。例如,可以创建一个带有特殊样式的按钮或是一个自定义的绘图区域。 PyQt 和 Qt Designer 结合使用可以非常方便地开发出功能丰富、界面美观的跨平台应用程序。通过以上示例可以看出,即使是初学者也能快速上手并实现基本的功能。