在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文件得到启发。有不完善的地方希望各位多多讨论。