Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用PySide2在QWizardPage中加载Qt设计器文件(.ui)_Python_Pyqt5_Pyside2_Qwizard_Qwizardpage - Fatal编程技术网

Python 如何使用PySide2在QWizardPage中加载Qt设计器文件(.ui)

Python 如何使用PySide2在QWizardPage中加载Qt设计器文件(.ui),python,pyqt5,pyside2,qwizard,qwizardpage,Python,Pyqt5,Pyside2,Qwizard,Qwizardpage,我想在Qt设计器中设计QWizardPages,并用PySide2将它们加载到Python程序中。以前我一直在使用PyQt5,没有任何问题,但是切换到PySide2似乎比预期的更难。 我面临的问题是,当我将QWizard页面添加到我的QWizard中时,确实会将该页面添加到向导中,但也会添加另一个(空)页面。我找不到我做错了什么,所以我想知道是否有人可以看看 我尝试使用函数addPage()和setPage()添加页面,但它们给出的结果相同。我还注意到,当我使用setTitle()明确设置页面标

我想在Qt设计器中设计QWizardPages,并用PySide2将它们加载到Python程序中。以前我一直在使用PyQt5,没有任何问题,但是切换到PySide2似乎比预期的更难。 我面临的问题是,当我将QWizard页面添加到我的QWizard中时,确实会将该页面添加到向导中,但也会添加另一个(空)页面。我找不到我做错了什么,所以我想知道是否有人可以看看

我尝试使用函数addPage()和setPage()添加页面,但它们给出的结果相同。我还注意到,当我使用setTitle()明确设置页面标题时,空(不需要的)页面会获得此标题,但不是我在Qt Designer中设计的页面

import os
import sys
from PySide2.QtWidgets import QWizard, QWizardPage, QApplication
from PySide2.QtCore import QFile
from PySide2.QtUiTools import QUiLoader
from enum import Enum


class MyWizard(QWizard):

    def __init__(self):
        super().__init__()

        self.setPage(PageNumbers.page_one.value, PageOne(self))


class PageOne(QWizardPage):

    def __init__(self, parent):
        super().__init__(parent)

        ui_file = os.path.join(__file__, '..', 'pageOne.ui')
        file = QFile(ui_file)
        file.open(QFile.ReadOnly)
        loader = QUiLoader()
        loader.load(file, parent)
        file.close()
        self.setTitle("This is another test Title")


class PageNumbers(Enum):
    page_one = 1


if __name__ == '__main__':

    app = QApplication(sys.argv)

    wizard = MyWizard()
    wizard.show()

    app.exec_()
我期望的是只有一个QWizardPage直接显示Finish按钮。相反,我得到了两个QWizardPage,如图所示:

有人能告诉我发生了什么事吗


(我使用PyQt5和以下代码获得了预期的结果:)

PyQt的开发人员实现函数,以便能够基于默认情况下未在Qt中实现的.ui创建类(Qt/C++使用
MOC
来完成这项工作),但在python的
PySide2Qt的情况下,它没有实现它,与允许填充类的
PyQt
不同,只有
QUiLoader
类允许基于.ui创建小部件

总之,PySide2中没有等效的loadUi函数,因此不能实现相同的逻辑。PySide2不是PyQt5,它们有自己的等价物,因为它们使用相同的基,但它们有实现、限制和优势

说到实际问题,考虑到.ui紧挨着.py,解决方案如下:

import os
import sys
from PySide2 import QtCore, QtWidgets, QtUiTools
from enum import Enum

class PageNumbers(Enum):
    page_one = 0

class MyWizard(QtWidgets.QWizard):
    def __init__(self):
        super().__init__()
        ui_file = os.path.join(os.path.dirname(os.path.abspath(__file__)) ,'PageOne.ui')
        page_one = create_widget(ui_file, self)
        self.setPage(PageNumbers.page_one.value, page_one)

def create_widget(filename, parent=None):
    file = QtCore.QFile(filename)
    if not file.open(QtCore.QFile.ReadOnly):
        return
    loader = QtUiTools.QUiLoader()
    widget = loader.load(file, parent)
    return widget

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    wizard = MyWizard()
    wizard.show()
    sys.exit(app.exec_())

共享pageOne.ui文件这是pageOne.ui文件:感谢您的良好解释,对于理解底层逻辑非常有帮助。它就像一个符咒!