PyQt 动态加载含有自定义控件的ui文件

在Qt中通常我们设计ui文件的时候,都会遇到将某一个控件(这里假设是一个QWidget)提升为我们自定义的一个控件(这里假设我们自定义的控件是TabWidget)。方法在网上很多地方都有,这里不做过多解释。下面我们主要讨论的是PyQt如何动态加载ui文件(注意:这里说的动态加载不是将ui文件先转换为py文件再import 对应的py,而是通过uic.laodUI()函数动态加载ui文件):

1.动态加载ui文件的优点之一就是客户可以通过修改ui文件随时改变应用程序的界面,而无需开发者动手。(比如添加图标,修改logo之类的);

2.动态加载ui文件步骤可以是:

2.1 from PyQt5 import uic;

2.2 dlg=uic.loadUi('mainwindow.ui')

2.3 如果我们的ui文件中含有名为widget的控件,则可以通过:dig.widget进行引用

3.我们自定义一个控件:这里我自定义个控件TabWidget,他继承自QTabWidget,文件是TabWidget.py:

# -*- coding: GBK-*- #
import sys
#from PyQt5.QtCore import *
#from PyQt5.QtGui import *
from PyQt5.QtWidgets import QWidget,QTabWidget,QTabBar
class TabWidget(QTabWidget):
    def __init__(self, txt='none',list=['a','b'],widgetList=[QWidget(),QWidget()],parent=None):
        super(TabWidget,self).__init__(parent)
        self.text=txt
        self.tabList=list
        self.widgetList=widgetList
        if len(list)!=len(widgetList):
            return
        print(1)
        for index,perTab in enumerate(list):
            print('x')
            self.addTab(widgetList[index], perTab)
    def resizeEvent(self,event):
        #super().paintEvent(event)
        total_width=self.width()
        count=len(self.tabList)
        if count>0:
            per_width=total_width/count
            str_stylesheet="QTabBar::tab{width:%dpx;height:30px;border-style: solid; border-width: 1px 1px 1px 1px;background:white;color:black;border-top-left-radius:6px;border-top-right-radius:6px;}QTabBar::tab:selected{border-style: solid; border-width: 1px 1px 1px 1px;border-bottom-color:white;background:white;color:black;}" % per_width 
            self.setStyleSheet(str_stylesheet)
        
        

4.接下来是本文最关键的一步,很多初学者不知道该怎么加载自定义的控件TabWidget进mainwindow.ui。首先用QtDesigner打开

mainwindow.ui,随便添加一个控件(这里是QWidget)随便起个name叫widget,选中这个QWidget右键点击,选中“提升为...”,提升的类名称填第3步代码的类名称TabWidget,最重要的是头文件,这里不能是我们Qt中默认的TabWidget.h,因为我们没有TabWidget.h只有TabWidget.py,我们要包含TabWidget模块进去,就要填TabWidget,如果TabWidget.py在你定义的一个包里面,比如Controls,就要填Controls.TabWidget

这样我们的uic.loadUi('mainwindow.ui')就能找到我们自定义的TabWidget模块并加载了。

5.写个测试程序(main.py),验证即可:

# -*- coding: GBK-*- #
import sys
from PyQt5.QtWidgets import QWidget,QMainWindow,QVBoxLayout,QHBoxLayout,QApplication,QComboBox,QPushButton,QLabel,QAction,QMenu,QFileDialog,QGroupBox
from PyQt5.QtCore import pyqtSignal,QObject,pyqtSlot
from PyQt5.Qt import QGridLayout
from PyQt5 import uic
def main():
    app = QApplication(sys.argv)
    
    app.setStyleSheet('QGroupBox{border: 1px solid;border-color:black;}');
    dlg=uic.loadUi('mainwindow.ui')
    dlg.widget.addTab(QWidget(),'c')
    dlg.show()
    app.exec()
if __name__ == "__main__":
    main()

最后感谢一下PyQt5快速开发与实战这本书的示例代码。我也是从他代码中的ui文件得到启发。有不完善的地方希望各位多多讨论。

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
PyQt是一个用于Python的Qt应用程序开发的绑定,它提供了Qt库的功能,包括GUI开发、网络编程等。如果你想要在PyQt中移除原有的样式,你可以使用`setStyleSheet()`方法或直接修改QStyle或者样式表文件。以下是一些基本步骤: 1. **使用`setStyleSheet()`**: ```python # 假设你有一个名为ui的QWidget实例 ui.setStyleSheet('') # 清空所有样式 ``` 2. **重置默认样式**: ```python from PyQt5.QtWidgets import QApplication QApplication.setStyle(QApplication.styleFactory().create('Fusion')) # 更换为默认样式或其他预定义样式 ``` 或者,如果你想要使用Qt的原生样式,可以使用`QApplication.setPalette()`方法。 3. **自定义样式表**: 如果你需要自定义样式,可以通过创建一个字符串,并将其作为样式表应用,例如去除特定元素的样式: ```python style = "QLineEdit { background-color: transparent; border: none; }" ui.setStyleSheet(style) ``` 4. **修改全局样式表**(`.qss`文件): 如果你希望长期更改全局样式,可以在项目的`resources`目录下创建一个`.qss`文件,然后在代码中加载: ```python from PyQt5.QtCore import QResource, QFile file = QFile(':/path/to/your_stylesheet.qss') file.open(QFile.ReadOnly | QFile.Text) stylesheet = file.readAll() ui.setStyleSheet(stylesheet) ``` 相关问题: 1. 如何在PyQt中设置自定义的QWidget样式? 2. PyQT中如何避免样式冲突? 3. 怎样在PyQt动态修改多个控件的样式?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值