我在 Designer 中开发了一个有点复杂的 UI,并使用 QUiLoader 将其加载到 PySide6 中。 它在开发过程中有效,但当我认为我已经完成时,它不再显示任何内容。脚本启动并运行,只是不再显示任何窗口。
我在 Windows 11、Python 3.12/PySide 6.7.2 和 3.11 上使用 PySide 运行此脚本。
我会给你一个具有相同行为的精简版本,我真的希望你能帮助我: (HelloWorld.ui的路径是正确的,我检查了好几遍)
from PySide6.QtUiTools import QUiLoader
from PySide6.QtCore import QFile
from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout
class Window(QWidget):
def __init__(self, parent=None):
super().__init__(parent=parent)
loader = QUiLoader()
ui_file = QFile('D:/Path/to/HelloWorld.ui')
ui_file.open(QFile.ReadOnly)
self.window = loader.load(ui_file, self)
root_layout = QVBoxLayout()
root_layout.addWidget(self.window)
self.setLayout(root_layout)
ui_file.close()
app = QApplication.instance()
if not app:
app = QApplication()
window = Window()
window.show()
app.exec()
代码中存在一个微妙的错误,导致小部件不显示。问题出在创建和使用布局的方式上。
正在创建
Window
小部件,并使用
QUiLoader
将
.ui
文件加载到
self.window
中。然后,创建一个新的
QVBoxLayout
并尝试将
self.window
添加到此布局中。
问题
在于
没有将布局设置到任何地方
。正在
Window
小部件上调用
setLayout
,但正在尝试设置
self.window
的布局,该布局是从
.ui
文件加载的小部件。
解决此问题的最简单方法是
直接将加载的小部件设置为
Window
小部件的中心小部件,而不使用额外的布局
。
以下是更正后的代码:
from PySide6.QtUiTools import QUiLoader
from PySide6.QtCore import QFile
from PySide6.QtWidgets import QApplication, QWidget
class Window(QWidget):
def __init__(self, parent=None):
super().__init__(parent=parent)
loader = QUiLoader()
ui_file = QFile('D:/Path/to/HelloWorld.ui')
ui_file.open(QFile.ReadOnly)
self.window = loader.load(ui_file, self)
ui_file.close()
# 将加载的小部件直接设置为中心小部件
self.setLayout(self.window.layout())
app = QApplication.instance()
if not app:
app = QApplication()
window = Window()
window.show()
app.exec()
通过使用
self.setLayout(self.window.layout())
,将从
.ui
文件加载的布局应用到
Window
小部件,从而确保所有小部件都正确显示。
其他建议:
-
为了使代码更简洁,可以使用
with
语句打开和关闭.ui
文件:
with QFile('D:/Path/to/HelloWorld.ui') as ui_file:
ui_file.open(QFile.ReadOnly)
self.window = loader.load(ui_file, self)
-
确保
.ui
文件中的顶级布局设置为“布局”,例如“垂直布局”或“水平布局”。 这将确保加载的小部件自动调整大小并正确显示。