在Qt designer中,新建一个QMainWindow,新建一个QWidget,并命名为widget,如图:
新建NewClass.py,输入代码:
# encoding: utf-8
from PySide6.QtWidgets import QWidget
class NewClass(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
print('IsNew')
新增提升NewClass,并将上面新建的widget提升
保存ui,回到python,输入代码:
import sys
from PySide6.QtCore import QFile
from PySide6.QtWidgets import QApplication
from PySide6.QtUiTools import QUiLoader
if __name__ == '__main__':
app = QApplication(sys.argv)
ui_loader = QUiLoader()
ui_file = QFile('../uis/form1.ui')
ui_file.open(QFile.ReadOnly)
form0 = ui_loader.load(ui_file)
ui_file.close()
form0.show()
sys.exit(app.exec())
发现并没有预料中的print('IsNew'),在代码中加入:
print(type(form0.widget))
运行结果为:
<class 'PySide6.QtWidgets.QWidget'>
就是说,并没有将部件提升。而之前明明在Qt designer中将其提升为NewClass了。打开Qt designer,其属性显示也是提升成功的。
而在pyqt5中,是可以的。
import sys
from PyQt5 import uic
from PyQt5.QtWidgets import QApplication
if __name__ == '__main__':
app = QApplication(sys.argv)
form0 = uic.loadUi('../uis/form1.ui')
# findChildren(form0)
print(type(form0.widget))
form0.show()
sys.exit(app.exec())
pyqt5的运行结果:
IsNew
<class 'NewClass.NewClass'>
继续尝试。在pyside6里采用先用uic工具转换成py文件再导入的方法,写以下代码:
import sys
from PySide6.QtWidgets import QApplication, QMainWindow
import form1_rc
class Form1(QMainWindow, form1_rc.Ui_MainWindow):
def __int__(self):
super(Form1, self).__init__()
self.setupUi(self)
if __name__ == '__main__':
app = QApplication([])
form1 = Form1()
form1.show()
sys.exit(app.exec())
很奇怪,别说自定义部件了,连窗口都没得显示,出了一个空白的画面。
究其原因,是因为这句没有成功运行:self.setupUi(self)
将这行成功运行的程序移到窗体实例化之后,如下:
import sys
from PySide6.QtWidgets import QApplication, QMainWindow
import form1_rc
class Form1(QMainWindow, form1_rc.Ui_MainWindow):
def __int__(self):
super(Form1, self).__init__()
# self.setupUi(self)
if __name__ == '__main__':
app = QApplication([])
form1 = Form1()
form1.setupUi(form1) # 移到这里
form1.show()
sys.exit(app.exec())
可以正常显示了
运行自定义部件的自定义初始化并加入信号连接,测试自定义部件的完整功能:
import sys
from PySide6.QtWidgets import QApplication, QMainWindow
import 按钮图标_rc
import form1_rc
class Form1(QMainWindow, form1_rc.Ui_MainWindow):
def __int__(self):
super(Form1, self).__init__()
if __name__ == '__main__':
app = QApplication(sys.argv)
form1 = Form1()
form1.setupUi(form1)
form1.show()
form1.widget_1.customSetup()
form1.widget_1.stateNum.connect(lambda x: form1.label_1.setText(str(x)))
sys.exit(app.exec())
成功运行:
在PYQT5中,使用uic工具转换成py文件再导入的方法,与Pyside6结果是相同的,都需要把窗体实例化之后再运行setupUi()。
所以,无论是 PYQT5还是pyside6,只要有“提升为”的自定义部件,通过使用uic工具转换成py文件再导入的方法,,都需要把窗体实例化之后再运行setupUi()。 PYQT5还可以通过uic.loadUi()的方法成功调用自定义部件,pyside6的类似工具不能成功调用“提升为”的自定义部件,原因并没有找到。