使用Qt Designer
Qt Designer是用于设计和构建图形用户界面的Qt工具。它允许您使用屏幕表单和简单的拖放界面设计窗口小部件,对话框或完整的主窗口。它能够预览您的设计,以确保它们按照您的意图工作,并允许您在编写任何代码之前与您的用户进行原型设计。
Qt Designer使用XML .ui
文件存储设计,并不自行生成任何代码。Qt包括uic
生成用于创建用户界面的C ++代码的实用程序。Qt还包括QUiLoader
允许应用程序加载.ui
文件并动态创建相应用户界面的类。
PyQt5不包装QUiLoader
类,而是包含 uic Python模块。像QUiLoader
这个模块可以加载 .ui
文件来动态创建用户界面。与uic 实用程序一样,它也可以生成将创建用户界面的Python代码。PyQt5的pyuic5实用程序是uic模块的命令行界面。两者都在以下部分中详细描述。
使用生成的代码
生成的代码与Qt生成的代码具有相同的结构, uic
并且可以以相同的方式使用。
代码结构化为从Python object
类型派生的单个类 。类的名称是在Designer中设置的顶层对象的名称Ui_
。(在C ++版本中,类在Ui
命名空间中定义。)我们将此类称为表单类。
该类包含一个名为的方法setupUi()
。这需要一个参数,即创建用户界面的小部件。此参数的类型(通常为QDialog, QWidget或 QMainWindow)在Designer中设置。我们将此类型称为Qt基类。
在以下示例中,我们假设.ui
已创建包含对话框的文件,并且QDialog 对象的名称为ImageDialog
。我们还假设包含生成的Python代码的文件的名称是ui_imagedialog.py
。然后可以以多种方式使用生成的代码。
第一个示例显示了直接方法,我们只需创建一个简单的应用程序来创建对话框:
import sys
from PyQt5.QtWidgets import QApplication, QDialog
from ui_imagedialog import Ui_ImageDialog
app = QApplication(sys.argv)
window = QDialog()
ui = Ui_ImageDialog()
ui.setupUi(window)
window.show()
sys.exit(app.exec_())
第二个示例显示了单继承方法,其中我们子类 QDialog并在__init__()
方法中设置用户界面 :
from PyQt5.QtWidgets import QDialog
from ui_imagedialog import Ui_ImageDialog
class ImageDialog(QDialog):
def __init__(self):
super(ImageDialog, self).__init__()
# Set up the user interface from Designer.
self.ui = Ui_ImageDialog()
self.ui.setupUi(self)
# Make some local modifications.
self.ui.colorDepthCombo.addItem("2 colors (1 bit per pixel)")
# Connect up the buttons.
self.ui.okButton.clicked.connect(self.accept)
self.ui.cancelButton.clicked.connect(self.reject)
最后一个示例显示了多继承方法:
from PyQt5.QtGui import QDialog
from ui_imagedialog import Ui_ImageDialog
class ImageDialog(QDialog, Ui_ImageDialog):
def __init__(self):
super(ImageDialog, self).__init__()
# Set up the user interface from Designer.
self.setupUi(self)
# Make some local modifications.
self.colorDepthCombo.addItem("2 colors (1 bit per pixel)")
# Connect up the buttons.
self.okButton.clicked.connect(self.accept)
self.cancelButton.clicked.connect(self.reject)
有关完整说明,请参阅Qt文档中的Qt Designer手册。
在UIC模块
在UIC模块包含以下功能和对象。
PyQt5.uic.widgetPluginPath
搜索窗口小部件插件的目录列表。最初它包含包含PyQt5附带的小部件插件的目录的名称。
PyQt5.uic.compileUi
(UIFILE,pyfile [,执行=假[,缩进= 4 [,from_imports =假[,resource_suffix = '_ RC' [,IMPORT_FROM = '' ] ] ] ] ] )
生成一个Python模块,该模块将从Qt Designer .ui
文件创建用户界面。
参数: |
|
---|---|
Resource_suffix: | |
是附加到文件中指定的任何资源文件的基名的后缀, |
PyQt5.uic.compileUiDir
(dir [,recurse = False [,map = None [,** compileUi_args ] ] ] )
从.ui
目录或目录树中的Qt Designer 文件创建Python模块。
参数: |
|
---|
PyQt5.uic.loadUiType
(uifile [,from_imports = False [,resource_suffix ='_ rc' [,import_from ='。' ] ] ] )
加载Qt Designer .ui
文件并返回生成的表单类和Qt基类的元组 。然后,这些可以用于创建任意数量的用户界面实例,而不必.ui
多次解析文件。
参数: |
|
---|---|
Resource_suffix: | |
是附加到文件中指定的任何资源文件的基名的后缀, |
|
返回类型: | 的形式类和Qt的基类。 |
PyQt5.uic.loadUi
(UIFILE [,baseinstance =无[,包= '' [,resource_suffix = '_ RC' ] ] ] )
加载Qt Designer .ui
文件并返回用户界面的实例。
参数: |
|
---|---|
Resource_suffix: | |
是附加到文件中指定的任何资源文件的基名的后缀, |
|
返回类型: |
|
pyuic5
所述pyuic5实用程序是一个命令行界面 UIC模块。该命令具有以下语法:
pyuic5 [options] .ui-file
完整的命令行选项是:
-h, --help
写入帮助消息stdout
。
--version
版本号写入stdout
。
-i
<N>
,
--indent
<N>
Python代码是使用<N>
空格缩进生成的。如果 <N>
为0则使用选项卡。默认值为4。
-o
<FILE>
,
--output
<FILE>
生成的Python代码将写入该文件<FILE>
。
-p
,
--preview
GUI是动态创建并显示的。没有生成Python代码。
-x
,
--execute
生成的Python代码包含少量附加代码,这些代码在作为独立应用程序执行时创建并显示GUI。
--import-from
<PACKAGE>
5.6版中的新功能。
资源模块是使用而不是简单导入的。from <PACKAGE> import ...
import ...
--from-imports
这相当于指定。--import-from .
--resource-suffix
<SUFFIX>
后缀<SUFFIX>
附加到文件中指定的任何资源文件.ui
的基名,以创建pyrcc5从资源文件生成的Python模块的名称。默认是 _rc
。例如,如果.ui
文件指定了一个被调用的资源文件, foo.qrc
那么相应的Python模块就是foo_rc
。
请注意,pyuic5生成的代码不保证与早期版本的PyQt5兼容。但是,它保证与更高版本兼容。如果您无法控制PyQt5的版本,那么您的应用程序的用户正在使用,那么您应该在安装过程中运行 pyuic5或调用compileUi()
。另一种方法是分发.ui
文件(可能作为资源文件的一部分)并让您的应用程序动态加载它们。
编写Qt Designer插件
Qt Designer可以通过编写插件来扩展。通常这是使用C ++完成的,但PyQt5也允许你用Python编写插件。大多数情况下,插件用于向Designer公开自定义窗口小部件,以便它像任何其他窗口小部件一样显示在Designer的窗口小部件框中。可以更改窗口小部件的属性并连接其信号和插槽。
也可以向Designer添加新功能。有关完整详细信息,请参阅Qt文档。在这里,我们将集中描述如何在Python中编写自定义小部件。
将Python自定义小部件与Designer集成的过程与使用C ++编写的小部件非常相似。但是,有一些特殊问题需要解决。
- Designer需要一个符合
QDesignerCustomWidgetInterface
该类定义的接口的C ++插件。(如果插件公开了多个自定义窗口小部件,那么它必须符合QDesignerCustomWidgetCollectionInterface
该类定义的接口 。)此外,插件类必须是子类QObject以及接口类。PyQt5不允许Python类从多个Qt类中进行子类化。 - Designer只能连接Qt信号和插槽。它不了解Python信号或callables。
- Designer只能编辑代表C ++类型的Qt属性。它不了解Python属性或Python类型。
PyQt5提供以下组件和功能,以尽可能简单地解决这些问题。
-
PyQt5的QtDesigner模块包含
QPy
已经从必要的Qt类中细分的其他类(所有这些类都有 前缀)。这避免了在Python中使用多个Qt类进行子类化的需要。例如,C ++自定义窗口小部件插件将从QObject中进行子类化, 而QDesignerCustomWidgetInterface
Python自定义窗口小部件插件将改为从QPyDesignerCustomWidgetPlugin进行子类 化。 -
PyQt5在Designer的插件目录中安装了一个C ++插件。它符合
QDesignerCustomWidgetCollectionInterface
类定义的接口。它搜索一组可配置的目录,查找实现从QPyDesignerCustomWidgetPlugin分类的类的Python插件。找到的每个类都被实例化,并且创建的实例将添加到自定义窗口小部件集合中。该
PYQTDESIGNERPATH
environment变量指定要搜索插件的目录集。目录名称由路径分隔符分隔(Windows上的分号和其他平台上的冒号)。如果目录名称为空(即,存在连续的路径分隔符或前导或尾随路径分隔符),则会在该点自动插入一组默认目录。默认目录是python
Designer搜索其自己的插件的每个目录的 子目录。如果未设置环境变量,则仅搜索默认目录。如果文件的基本名称没有结束,plugin
则忽略它。 -
Python自定义小部件可以使用定义新的Qt信号
pyqtSignal()
。 -
可以使用
pyqtSlot()
装饰器将Python方法定义为新的Qt槽 。 -
可以使用该
pyqtProperty()
函数定义新的Qt属性。
请注意,从Python定义新的Qt信号,插槽和属性的能力对于符合任何插件接口的插件而言可能是有用的,而不仅仅是Designer使用的插件。
有关定义新Qt信号,插槽和属性及其插件的自定义窗口小部件的简单但完整且完整记录的示例,请查看examples/designer/plugins
PyQt5源包的 目录。该 widgets
子目录包含pydemo.py
自定义部件和python
子目录包含它的pydemoplugin.py
插件。