【PyQt】在QtDesigner中使用自定义组件

本文节选自笔者博客: https://www.blog.zeeland.cn/archives/eoifh3szz

前言

本文将介绍pyqt如何在在QtDesigner中使用自定义组件,给出整个流程的方法。这个问题是本文在接触到 https://github.com/zhiyiYo/PyQt-Fluent-Widgets/ 这个项目时遇到的问题,PyQt-Fluent-Widgets 是一个PyQt的组件库,通过PyQt-Fluent-Widgets ,你可以构建好看的PyQt的UI。

问题在这里,PyQt-Fluent-Widgets,实现了pyqt中的QPushButton等控件,假设名为button.pyPushButton,现在我有一个基于pyqt开发的老项目,想要在尽可能不改动原有代码的前提下进行Button的样式风格进行迁移,迁移成button.py中的button风格,如PrimaryPushButton或者PushButton。老项目采用Qt Designer开发,并采用pyuic.ui文件转换成.py文件,如home.ui转换成home.py文件,我继承了一个类叫做home_controller.py,继承了home.py中的Ui_MainWindow类,现在我需要在尽可能不改动原有老项目的代码的基础上,提供一个button转换的解决方案

这样子做有三个注意事项:

  1. 在尽可能不改动原有代码的前提下进行button的样式风格进行迁移,迁移成button.py中的button风格,如PrimaryPushButton
  2. 不能改动home.py文件,只能改动home_controller.py文件
  3. 假定home.py只有一个空的页面,里面只有一个QPushButton的按钮

当时我想了好一会,暂时没想到解决方案,最后在关于qt-designer中使用组件的问题 · Issue #46 · zhiyiYo/PyQt-Fluent-Widgets (github.com) 中看到有相关使用者进行尝试,给我提供了思路。

问题描述

可以在qtdesigner用的,比如lineEdit,你在qtdesigner正常添加LineEdit控件,然后右键,把它提升为 LineEdit (作者写的组建名),头文件就写 qfluentwidgets .这样你的ui文件生成py文件的时候,会自动import这个组件。

通过这种方式,就可以实现在Qt Designer中直接使用自定义的组件了,但是qfluentwidgets这个库在此处的引用还是有一些问题,因为qfluentwidgets作者在开发插件的时候,有一些控件的形参和其父类的形参是不一样的,什么意思呢?

简单来说就是qfluentwidgets作者的PushButton是这么定义的:

class PushButton(QPushButton):  
    """ push button """  
  
    def __init__(self, text: str, parent=None, icon: Union[QIcon, str, FluentIconBase] = None):
    ...

但是原生的QPushButton是这样定义的:

class QPushButton(QAbstractButton):  
	def __init__(self, *__args): # real signature unknown; restored from __doc__ with multiple overloads  
	    pass

说明text不是必填项,如果在QtDesigner想要设置自定义控件,那么形参一定要完全兼容父类才行,即你初始化CustomButton和初始化QPushButton的代码需要是一样的才可以,因此qfluentwidgets的控件代码和原生的不一样,需要写一个中间类进行改动。

解决方案

在这里,我想要使用qfluentwidgets里的PushButton控件,接下来将展示如何在Qt Designer中引用qfluentwidgets的控件,本项目在Undertone0809/pyqt-user-login: 一个基于PyQtMVC封装用户注册登陆模块模板 (github.com) 的基础上进行改造,旨在优化其UI。

首先,我们可以尝试新建一个/components/custom_button.py,代码如下:

from qfluentwidgets import PushButton  
  
  
class CustomButton(PushButton):  
    def __init__(self, parent=None):  
        super().__init__('', parent)

上面的代码继承了我想要使用的qfluentwidgets里的PushButton控件。

接下来,我们再新建一个/components/__init__.py,代码如下:

from .custom_button import CustomButton

最后,我们在Qt Designer中这样设置,新建一个CustomButton的类,然后头文件为components,如下图所示。

这个时候,我们就可以正常将一个普通的QPushButton 提升为CustomButton了,最后把ui转换成py,从下面的代码我们可以看到,自定义的控件转变成了from components import CustomButton了,到这个地步就差不多了,让我们来运行一下。

大功告成!

Qt Designer中设置自定义Widget(如PyQt-Fluent-Widgets中的组件)的样式通常涉及以下几个步骤: 1. **创建自定义组件**:首先,您需要创建一个继承自QMainWindow或其他基础QWidget的自定义类,如`CustomButton`。这可以通过在PyQt项目中创建一个新的Python文件并导入所需的库来实现[^1]。 ```python from PyQt5.QtWidgets import QMainWindow, QWidget, QPushButton from PyQt5.QtCore import Qt class CustomButton(QPushButton): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setFlat(True) # 使用Fluent风格 self.buttonStyle() # 自定义样式 # ... 在适当的地方实现buttonStyle方法 ``` 2. **设计界面**:在Qt Designer中,右键点击空白区域,选择"Insert Widget" -> "Custom Widget",然后从下拉菜单中选择您的自定义类(在这个例子中是`CustomButton`)。 3. **配置样式**:在Qt Designer中,您可以调整新添加的自定义按钮的外观。使用控件属性面板,可以修改颜色、字体、大小和其他视觉元素。对于PyQt-Fluent-Widgets,可能还需要额外的CSS样本来定制某些特定样式。 4. **编写槽函数**:在`CustomButton`类中,编写槽函数以响应用户的交互,这将在运行时绑定到Qt Designer中设置的信号。 5. **编译UI**:最后,在您的应用中加载这个UI文件,确保它能够与自定义组件正确交互。在Python代码中,可以使用`loadUi`函数完成这个过程。 注意,为了保证控件能正确工作,自定义控件的设计必须兼容其父类的标准参数。在本例中,这意味着`CustomButton`的构造函数应该接受相同的参数,如同`QPushButton`一样。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zeeland

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值