【问题标题】:PySide2 QUiLoader returns an empty windowPySide2 QUiLoader 返回一个空窗口
【发布时间】:2018-10-12 04:31:42
【问题描述】:

PySide2(5.6.0~a1) Qt UI 文件加载器返回一个空窗口,而 PyQt5 加载器工作正常。你能向我解释我错在哪里吗?

非工作 PySide2 版本:

import sys
from PySide2.QtWidgets import QDialog, QApplication
from PySide2 import QtUiTools

class AppWindow(QDialog):
    def __init__(self):
        super().__init__()
        self.ui = QtUiTools.QUiLoader().load("dialog1.ui")
        self.show()

app = QApplication(sys.argv)
w = AppWindow()
sys.exit(app.exec_())

工作 PyQt5 版本:

import sys
from PyQt5.QtWidgets import QDialog, QApplication
from PyQt5 import uic

class AppWindow(QDialog):
    def __init__(self):
        super().__init__()
        self.ui = uic.loadUi("dialog1.ui", self)
        self.show()

app = QApplication(sys.argv)
w = AppWindow()
sys.exit(app.exec_())

使用此功能也不起作用:

def loadUiWidget(uifilename, parent=None):
    loader = QtUiTools.QUiLoader()
    uifile = QtCore.QFile(uifilename)
    uifile.open(QtCore.QFile.ReadOnly)
    ui = loader.load(uifile, parent)
    uifile.close()
    return ui

【问题讨论】:

    标签: python pyqt pyqt5 pyside2


    【解决方案1】:

    在 PySide2 中,没有 QMainWindow 类覆盖自身的功能。需要显示ui:

    import sys
    from PySide2.QtWidgets import QDialog, QApplication
    from PySide2 import QtUiTools
    
    class AppWindow(QDialog):
        def __init__(self):
            super().__init__()
            self.ui = QtUiTools.QUiLoader().load("dialog1.ui")
            self.ui.show()
    
    app = QApplication(sys.argv)
    w = AppWindow()
    sys.exit(app.exec_())
    

    【讨论】:

      【解决方案2】:

      QUiLoader().load() 将小部件作为对象返回,因此如果将其分配给变量,它将不会做任何事情,您应该使用 show()

      import sys
      from PySide2.QtWidgets import QApplication
      from PySide2 import QtUiTools
      
      app = QApplication(sys.argv)
      w = QtUiTools.QUiLoader().load("dialog1.ui")
      w.show()
      sys.exit(app.exec_())
      

      【讨论】:

      • 感谢 Eyllanesc。就我而言,我做了以下更改:self.ui.show()
      • .... 它可以工作,但我丢失了我在 Qt Designer 中制作的信号/插槽配置,这没什么大不了的。你知道有一种方法可以达到和 PyQt5 中一样的结果,即在 Qt Designer 中创建的所有小部件都是 Mydialog 类的实例变量吗?
      • @u2gilles 你能找到答案吗?我面临着同样的事情......谢谢!
      【解决方案3】:

      如果您想从设计器*.ui 文件中加载QMainWindow,您可以使用

      import sys
      from PySide2.QtWidgets import QApplication, QMainWindow
      from PySide2.QtUiTools import QUiLoader
      
      class MainWindow(QMainWindow):
          def __init__(self):
              super().__init__()
              self.setCentralWidget(QUiLoader().load("form.ui"))
      

      但在 *.ui 文件中的设计器中设置的插槽信号绑定无论如何都不起作用

      因此,对于设计器 GUI 和插槽信号绑定的全功能使用,我发现的唯一方法是

      pyside2-uic mainwindow.ui > ui_mainwindow.py
      

      然后

      import sys
      from PySide2.QtWidgets import QApplication, QMainWindow
      from ui_mainwindow import Ui_MainWindow
      
      class MainWindow(QMainWindow, Ui_MainWindow):
          def __init__(self):
              super(MainWindow, self).__init__()
              self.setupUi(self)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-04
        相关资源
        最近更新 更多