PySide6:ui文件(来自Designer或QtCreater)与QUiLoader和pyside6-uic一起使用

Posted horacezhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PySide6:ui文件(来自Designer或QtCreater)与QUiLoader和pyside6-uic一起使用相关的知识,希望对你有一定的参考价值。

本页介绍使用Qt Designer为您的Qt for Python项目创建基于Qt Widgets的图形界面。Qt Designer是一种图形用户界面设计工具,可以作为独立的二进制文件(pyside6设计器)使用,也可以嵌入到Qt Creator IDE中。在使用Qt Designer中介绍了它在Qt Creator中的使用。

PySide6:ui文件(来自Designer或QtCreater)与QUiLoader和pyside6-uic一起使用_python

设计存储在.ui文件中,该文件是基于XML的格式。它将被pyside6-uic工具转换为Python或C++代码,在项目构建时填充小部件实例。

要在Qt Creator中创建新的Qt设计表单,请选择文件/新文件或项目,然后选择模板的“主窗口”。将其保存为mainwindow.ui。将QPushButton添加到centralwidget的中心。

您的文件​​mainwindow.ui​​应该如下所示:

<?xml versinotallow="1.0" encoding="UTF-8"?>
<ui versinotallow="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralWidget">
<widget class="QPushButton" name="pushButton">
<property name="geometry">
<rect>
<x>110</x>
<y>80</y>
<width>201</width>
<height>81</height>
</rect>
</property>
<property name="text">
<string>PushButton</string>
</property>
</widget>
</widget>
<widget class="QMenuBar" name="menuBar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>20</height>
</rect>
</property>
</widget>
<widget class="QToolBar" name="mainToolBar">
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
</attribute>
<attribute name="toolBarBreak">
<bool>false</bool>
</attribute>
</widget>
<widget class="QStatusBar" name="statusBar"/>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
<connections/>
</ui>

现在,我们准备决定如何使用Python中的UI文件。

选项A:生成Python类

与UI文件交互的标准方法是从中生成Python类。这得益于pyside6 uic工具。要使用此工具,需要在控制台上运行以下命令:

pyside6-uic mainwindow.ui > ui_mainwindow.py

我们将命令的所有输出重定向到名为ui_mainwindow.py的文件。它将直接导入:

from ui_mainwindow import Ui_MainWindow

现在要使用它,我们应该为我们的小部件创建一个个性化的类来设置这个生成的设计。

为了理解这个想法,让我们看看整个代码:

import sys
from PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtCore import QFile
from ui_mainwindow import Ui_MainWindow

class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)

if __name__ == "__main__":
app = QApplication(sys.argv)

window = MainWindow()
window.show()

sys.exit(app.exec())

前面的例子已经知道if语句中的内容,我们的新基本类只包含两行新行,负责从UI文件加载生成的python类:

self.ui = Ui_MainWindow()
self.ui.setupUi(self)

提示:

每次更改UI文件时,必须再次运行pyside6-uic。

选项B:直接加载

要直接加载UI文件,我们需要QtUiTools模块中的类:

from PySide6.QtUiTools import QUiLoader

QUiLoader允许我们动态加载ui文件并立即使用:

ui_file = QFile("mainwindow.ui")
ui_file.open(QFile.ReadOnly)

loader = QUiLoader()
window = loader.load(ui_file)
window.show()

此示例的完整代码如下所示:

# File: main.py
import sys
from PySide6.QtUiTools import QUiLoader
from PySide6.QtWidgets import QApplication
from PySide6.QtCore import QFile, QIODevice

if __name__ == "__main__":
app = QApplication(sys.argv)

ui_file_name = "mainwindow.ui"
ui_file = QFile(ui_file_name)
if not ui_file.open(QIODevice.ReadOnly):
print(f"Cannot open ui_file_name: ui_file.errorString()")
sys.exit(-1)
loader = QUiLoader()
window = loader.load(ui_file)
ui_file.close()
if not window:
print(loader.errorString())
sys.exit(-1)
window.show()

sys.exit(app.exec())

然后,要执行它,只需在命令提示符下运行以下命令:

python main.py

提醒:

QUiLoader使用connect()调用,将函数签名作为信号/插槽连接的字符串参数。因此,它无法从用Python编写的自定义小部件中处理诸如str或list之类的Pythone类型,因为这些类型在内部映射到不同的C++类型。

Qt Designer中的自定义小工具

Qt Designer能够使用用户提供的(自定义)小部件。它们显示在窗口小部件框中,可以像Qt的窗口小部件一样拖到表单上(请参阅​​使用Qt设计器的自定义窗口小部件​​)。通常,这需要将小部件实现为用C++编写的Qt Designer插件,实现其QDesignerCustomWidgetInterface。

Qt for Python为此提供了一个简单的接口,类似于​​registerCustomWidget​​()。

小部件需要作为Python模块提供,如小部件绑定示例(文件​​wigglywidget.py​​​)或taskmenuextension示例(文件​​tictactoe.py​​)所示。

通过提供名为register*的注册脚本,可以向Qt Designer注册此内容。py并将路径类型环境变量PYSIDE_DESIGNER_PLUGINS指向目录。

注册脚本的代码如下所示:

# File: registerwigglywidget.py
from wigglywidget import WigglyWidget

import QtDesigner


TOOLTIP = "A cool wiggly widget (Python)"
DOM_XML = """
<ui language=c++>
<widget class=WigglyWidget name=wigglyWidget>
<property name=geometry>
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>200</height>
</rect>
</property>
<property name=text>
<string>Hello, world</string>
</property>
</widget>
</ui>
"""

QPyDesignerCustomWidgetCollection.registerCustomWidget(WigglyWidget, module="wigglywidget",
tool_tip=TOOLTIP, xml=DOM_XML)

QPyDesignerCustomWidgetCollection提供QDesignerCustomWidgetCollectionInterface的实现,该接口使用静态便利函数向Qt Designer公开自定义小部件,用于注册类型或添加QDesigner CustomwidgetInterface的实例。

函数registerCustomWidget()用于向Qt Designer注册小部件类型。在简单的情况下,它可以像QUiLoader.registerCustomWidget()一样使用。它接受自定义小部件类型和一些可选关键字参数,这些参数传递与QDesignerCustomWidgetInterface的getter相对应的值.

当通过其启动器pyside6设计器启动Qt Designer时,自定义小部件应该在小部件框中可见。

对于高级用法,还可以向函数传递类QDesignerCustomWidgetInterface的实现,而不是addCustomWidget()的类型。这在taskmenuextension示例中显示,其中为自定义小部件注册了自定义上下文菜单。该示例是相应的C++任务菜单扩展示例的一个端口。

Qt Designer插件故障排除

  • 必须使用启动器pyside6设计器。独立Qt Designer不会加载插件。
  • 菜单项Help/About Plugin打开一个对话框,显示找到的插件和潜在的加载错误消息。
  • 检查控制台或Windows调试视图以了解更多错误消息。
  • 由于Python对输出进行缓冲,因此只有在Qt Designer终止后,才会出现错误消息。
  • 在为Python构建Qt时,请确保将插件的--standalone选项设置为正确安

以上是关于PySide6:ui文件(来自Designer或QtCreater)与QUiLoader和pyside6-uic一起使用的主要内容,如果未能解决你的问题,请参考以下文章

怎么把altium designer winter 里画的原理图放在Word 里??

Altium Designer 怎么改单位为公制?

ALTIUM DESIGNER 09 哪几个快捷键最最常用的???

使用来自 Sharepoint Designer 中已连接 LVWP 的参数的 xslt 过滤 DVWP

你如何强制 Visual Studio 为 aspx/ascx 文件重新生成 .designer 文件?

altium designer使用小技巧,记录