使用Qt Designer

    使用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.compileUiUIFILEpyfile [,执行=假[,缩进= 4 [,from_imports =假[,resource_suffix = '_ RC' [,IMPORT_FROM = '' ] ] ] ] ] )

生成一个Python模块,该模块将从Qt Designer .ui文件创建用户界面。

参数:
  • uifile - 包含该.ui文件的文件名或类文件对象。
  • pyfile - 生成的Python代码将写入的类文件对象。
  • execute - 如果要生成少量额外代码,则可选择设置,如果代码作为独立应用程序运行,将显示用户界面。
  • indent - 生成的代码中用于缩进的可选空格数。如果为零,则使用制表符。
  • from_imports - 可选地设置为生成相对import语句。目前,这仅适用于资源模块的导入。
  • import_from - 可选地设置为用于相对import语句的包。默认是'.'
Resource_suffix:
 

是附加到文件中指定的任何资源文件的基名的后缀,.ui用于创建从资源文件生成的Python模块的名称pyrcc5。默认是'_rc',即如果.ui文件指定了一个被调用的资源文件,foo.qrc那么相应的Python模块就是foo_rc

PyQt5.uic.compileUiDirdir [,recurse = False [,map = None [,** compileUi_args ] ] ] )

.ui目录或目录树中的Qt Designer 文件创建Python模块。

参数:
  • dir - 要扫描名称以其结尾的文件的目录的名称 .ui。默认情况下,生成的Python模块在以.py。结尾的同一目录中创建。
  • recurse - 如果应扫描任何子目录,则可选择设置。
  • map - 一个可选的可调用对象,它传递包含该.ui文件的目录的名称以及将要创建的Python模块的名称。callable应该返回一个元组,该元组将在其中创建Python模块的目录名称和模块的(可能已修改的)名称。
  • compileUi_args - 传递给compileUi()它的任何其他关键字参数, 用于创建每个Python模块。

PyQt5.uic.loadUiTypeuifile [,from_imports = False [,resource_suffix ='_ rc' [,import_from ='。' ] ] ] )

加载Qt Designer .ui文件并返回生成的表单类Qt基类的元组 。然后,这些可以用于创建任意数量的用户界面实例,而不必.ui多次解析文件。

参数:
  • uifile - 包含该.ui文件的文件名或类文件对象。
  • from_imports - 可选地设置为生成相对import语句。目前,这仅适用于资源模块的导入。
  • import_from - 可选地设置为用于相对import语句的包。默认是'.'
Resource_suffix:
 

是附加到文件中指定的任何资源文件的基名的后缀,.ui用于创建从资源文件生成的Python模块的名称pyrcc5。默认是'_rc',即如果.ui文件指定了一个被调用的资源文件,foo.qrc那么相应的Python模块就是foo_rc

返回类型:

形式类Qt的基类

PyQt5.uic.loadUiUIFILE [,baseinstance =无[,包= '' [,resource_suffix = '_ RC' ] ] ] )

加载Qt Designer .ui文件并返回用户界面的实例。

参数:
  • uifile - 包含该.ui文件的文件名或类文件对象。
  • baseinstance - Qt基类的可选实例。如果指定,则在其中创建用户界面。否则,将自动创建基类的新实例。
  • package - 可选包,它是任何相对导入的自定义小部件的基础包。
Resource_suffix:
 

是附加到文件中指定的任何资源文件的基名的后缀,.ui用于创建从资源文件生成的Python模块的名称pyrcc5。默认是'_rc',即如果.ui文件指定了一个被调用的资源文件,foo.qrc那么相应的Python模块就是foo_rc

返回类型:

QWidget实现用户界面的子类。

   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中进行子类化, 而QDesignerCustomWidgetInterfacePython自定义窗口小部件插件将改为从QPyDesignerCustomWidgetPlugin进行子类 

  • PyQt5在Designer的插件目录中安装了一个C ++插件。它符合QDesignerCustomWidgetCollectionInterface 类定义的接口。它搜索一组可配置的目录,查找实现从QPyDesignerCustomWidgetPlugin分类的类的Python插件。找到的每个类都被实例化,并且创建的实例将添加到自定义窗口小部件集合中。

    该 PYQTDESIGNERPATHenvironment变量指定要搜索插件的目录集。目录名称由路径分隔符分隔(Windows上的分号和其他平台上的冒号)。如果目录名称为空(即,存在连续的路径分隔符或前导或尾随路径分隔符),则会在该点自动插入一组默认目录。默认目录是pythonDesigner搜索其自己的插件的每个目录的 子目录。如果未设置环境变量,则仅搜索默认目录。如果文件的基本名称没有结束,plugin 则忽略它。

  • Python自定义小部件可以使用定义新的Qt信号 pyqtSignal()

  • 可以使用pyqtSlot()装饰器将Python方法定义为新的Qt槽 。

  • 可以使用该pyqtProperty() 函数定义新的Qt属性。

请注意,从Python定义新的Qt信号,插槽和属性的能力对于符合任何插件接口的插件而言可能是有用的,而不仅仅是Designer使用的插件。

有关定义新Qt信号,插槽和属性及其插件的自定义窗口小部件的简单但完整且完整记录的示例,请查看examples/designer/pluginsPyQt5源包的 目录。该 widgets子目录包含pydemo.py自定义部件和python子目录包含它的pydemoplugin.py插件。 

猜你喜欢

转载自blog.csdn.net/Yuyh131/article/details/84648933
今日推荐