Python 如何使用PySide2在QWizardPage中加载Qt设计器文件(.ui)
我想在Qt设计器中设计QWizardPages,并用PySide2将它们加载到Python程序中。以前我一直在使用PyQt5,没有任何问题,但是切换到PySide2似乎比预期的更难。 我面临的问题是,当我将QWizard页面添加到我的QWizard中时,确实会将该页面添加到向导中,但也会添加另一个(空)页面。我找不到我做错了什么,所以我想知道是否有人可以看看 我尝试使用函数addPage()和setPage()添加页面,但它们给出的结果相同。我还注意到,当我使用setTitle()明确设置页面标题时,空(不需要的)页面会获得此标题,但不是我在Qt Designer中设计的页面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()明确设置页面标
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文件:感谢您的良好解释,对于理解底层逻辑非常有帮助。它就像一个符咒!