3

我想在 Qt Designer 中设计我的 QWizardPages,我想用 PySide2 将它们加载到我的 Python 程序中。以前我一直在使用 PyQt5 没有任何问题,但是切换到 PySide2 似乎比预期的要难。我面临的问题是,当我将 QWizardPage 添加到我的 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 按钮。相反,我得到两个 QWizardPages,如下图所示:

在此处输入图像描述

有人可以告诉我发生了什么事吗?

(我使用 PyQt5 和以下代码获得了预期的结果:https ://pastebin.com/6W2sx9M1 )

4

1 回答 1

3

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

总之,在 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_())
于 2019-01-17T21:48:37.590 回答