首页 > 编程问答 >如何在 PySide 中从 .ui 文件加载子项?

如何在 PySide 中从 .ui 文件加载子项?

时间:2024-07-23 10:25:32浏览次数:6  
标签:python user-interface pyside qt-designer uic

现在我像这样加载它们:

if __name__ == '__main__':
    app = QApplication(sys.argv)
    loader = QUiLoader()
    file = QFile('main.ui')
    file.open(QFile.ReadOnly)
    window = loader.load(file)
    file.close()
    window.show()
    # Here:
    window.centralwidget.findChild(QListWidget, 'listWidget').addItems(['Item {0}'.format(x) for x in range(100)])
    sys.exit(app.exec_())

但我认为这很不舒服,有没有其他方法,可能加载整个命名空间或其他什么?


是的,有一种更方便的方法可以在 PySide 中从 .ui 文件加载子项。不必使用 findChild 手动搜索每个小部件,而是可以利用自动连接功能。这使可以通过名称直接访问 .ui 文件中定义的对象。

以下是使用自动连接改进代码的方法:

  1. 在 Qt Designer 中设置对象名称: 确保要在 .ui 文件中访问的每个小部件都有唯一的对象名称。可以在 Qt Designer 的属性编辑器中执行此操作。

  2. 使用 loadUiType 函数: PySide 提供了一个名为 loadUiType 的函数,该函数可以将 .ui 文件分成 Python 类定义和 UI 对象。

  3. 从生成的类继承: 创建一个从 loadUiType 函数返回的 UI 类继承的 Python 类。

  4. 访问小部件: 在的自定义类中,可以通过其对象名称直接访问小部件,就好像它们是类的成员一样。

示例:

main.ui 文件(使用 Qt Designer 创建):

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <widget class="QWidget" name="centralwidget">
   <widget class="QListWidget" name="listWidget">
    <property name="geometry">
     <rect>
      <x>20</x>
      <y>20</y>
      <width>256</width>
      <height>192</height>
     </rect>
    </property>
   </widget>
  </widget>
 </widget>
</ui>

Python 代码:

import sys
from PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtUiTools import loadUiType

Ui_MainWindow, QMainWindow = loadUiType("main.ui")

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

        # 通过名称直接访问 listWidget
        self.listWidget.addItems([f"Item {x}" for x in range(100)])

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

在此示例中,我们使用 loadUiType 加载 main.ui 文件,然后创建一个继承自生成的 Ui_MainWindow 类和 QMainWindow 的自定义 MainWindow 类。这使我们能够直接访问 listWidget 对象及其方法,而无需使用 findChild

此方法更清晰、更易于维护,尤其是对于包含许多小部件的复杂 UI。

标签:python,user-interface,pyside,qt-designer,uic
From: 27603350

相关文章

  • python进阶---闭包与装饰器
    一、闭包        在Python中,闭包是指一个函数内部定义的函数,这个内部函数可以访问并修改其外部函数的局部变量,即使外部函数已经执行完毕。闭包可以通过多层函数嵌套来实现。    闭包的三要素:    1、外部函数嵌套内部函数    2、外部函数返......
  • 强制从当前包自动导入的 Python 以此包的名称为前缀
    我在VSCode中使用Python和Pylance扩展。在我正在编辑的自己的包中,自动添加的导入(设置“导入格式:绝对”)如下所示:frommydirectory.myfileimportmyclass但是,我的Python包正在被被一个(非常愚蠢且不可协商的)外部系统消耗,该系统拒绝正确解释它,除非导入的格式特别......
  • Python语言-面向对象
    知识代码classJobSalary(object):job=''def__init__(self,city):self.jobname="数据分析师"self.exp=''self.city=city#方法defdata_normalize(self,data):print(f'正在规范化......
  • 需要帮助使用 Selenium Python 单击 Microsoft Teams 按钮
    我将Python与Selenium结合使用,并自动登录MicrosoftTeams。进入后,弹出窗口显示我需要单击“立即切换”以切换到V2版本。我似乎无法使用SeleniumPython成功单击此按钮。谁能帮我自动点击这个按钮?这是我不成功的尝试:self.driver.find_element(By.CLASS_NAME,......
  • python接口自动化(四十)- logger 日志 - 下(超详解)
    宏哥微信粉丝群:https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介按照上一篇的计划,这一篇给小伙伴们讲解一下:(1)多模块使用logging,(2)通过文件配置logging模块,(3)自己封装一个日志(logging)类。可能有的小伙伴在这里会有个疑问一个logging为什么分两篇的篇幅......
  • Python面试题:使用NumPy进行高效数组运算
    NumPy是Python中进行高效数组运算的基础库。以下是一些示例,展示了如何使用NumPy进行高效的数组运算,包括创建数组、数组操作、数学运算以及一些高级操作。安装NumPy如果你还没有安装NumPy,可以通过以下命令进行安装:pipinstallnumpy示例代码1.创建数组import......
  • Python面试题:使用Matplotlib和Seaborn进行数据可视化
    使用Matplotlib和Seaborn进行数据可视化是数据分析中非常重要的一部分。以下示例展示了如何使用这两个库来创建各种图表,包括基本的线图、柱状图、散点图和高级的分类数据可视化图表。安装Matplotlib和Seaborn如果你还没有安装这两个库,可以使用以下命令进行安装:pipins......
  • 20、Python之容器:红楼主角都有谁?10行代码生成《红楼梦》词云图
    引言Python系列前面的文章中,我们介绍了Python中容器的基本使用,上一篇中,我们又重点介绍了Counter计数器的使用。这些介绍,应该足以应付日常的工作需求了。在今天的文章中,我想以词云图的生成这个综合案例,巩固一下前面关于容器、字典推导式、Counter的使用。同时,介绍两个比较好......
  • 使用snowflake.connector 3.0.3上的密钥对从python连接到snowflake
    我正在尝试使用Snowflake.connector包从我的Python代码连接到Snowflake。不幸的是,由于遗留代码,我只能在python3.7.3上使用Snowflake连接器版本3.0.3,并且无法升级我确实设法从我自己的计算机进行连接,使用:con=Snowflake.connector。连接(...私有密钥文件=......
  • python 文件(txt)操作
    我有一个txt文件,其中包含一列(大约2000个)单词。每个单词只用一个新行分隔。我想将所有这些单词存储在一个数组中words.txt文件的示例:applebananaorange我尝试过的代码:importrandomwithopen('E:/Code/learn/Projects/word-guessing-game/words.txt','r')a......