【问题标题】:How to load a Qt Designer file (.ui) in a QWizardPage using PySide2如何使用 PySide2 在 QWizardPage 中加载 Qt Designer 文件 (.ui)
【发布时间】:2019-06-12 03:44:37
【问题描述】:

我想在 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 直接显示完成按钮。相反,我得到了两个 QWizardPages,如下图所示:

谁能告诉我这是怎么回事?

(我使用 PyQt5 得到了预期的结果,代码如下:https://pastebin.com/6W2sx9M1

【问题讨论】:

标签: python pyqt5 pyside2 qwizard qwizardpage


【解决方案1】:

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_())

【讨论】:

  • 感谢您的精彩解释,对理解底层逻辑很有帮助。它就像一个魅力!
猜你喜欢
  • 1970-01-01
  • 2017-09-05
  • 2020-07-17
  • 2019-02-07
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多