pyside6,“提升为”的部件使用困惑

在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的类似工具不能成功调用“提升为”的自定义部件,原因并没有找到。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

深蓝海拓

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

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

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

打赏作者

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

抵扣说明:

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

余额充值