python - PyQT 与 QT Creator
问题描述
我正在尝试使用 PySide 和 QT Creator 开发一个小型 gui。作为基本实现,我选择了一个QMainWindow
. 问题是,当我运行代码时,将任何元素添加到编辑器内的 MainWindow 会导致一个空窗口。
最初生成的 python 代码如下所示:
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.load_ui()
def load_ui(self):
loader = QUiLoader()
path = os.path.join(os.path.dirname(__file__), "form.ui")
ui_file = QFile(path)
ui_file.open(QFile.ReadOnly)
loader.load(ui_file, self)
ui_file.close()
if __name__ == "__main__":
app = QApplication([])
widget = MainWindow()
widget.show()
sys.exit(app.exec_())
我知道loader.load(ui_file, self)
返回一个小部件。我的解决方案是:
def load_ui(self):
loader = QUiLoader()
path = os.path.join(os.path.dirname(__file__), "form.ui")
ui_file = QFile(path)
ui_file.open(QFile.ReadOnly)
self.window = loader.load(ui_file, self)
self.window.show()
ui_file.close()
if __name__ == "__main__":
app = QApplication([])
widget = MainWindow()
#widget.show() <<<<<<--- removing this
sys.exit(app.exec_())
这对我有用,但这显然不是应该的工作方式。我对为什么 QT Creator 给我这个不工作的模板感到困惑。
此外,我很好奇应该如何实现自定义功能。单击clicked()
按钮的插槽时,它告诉我
No ui_form.h found! (translated)
我最终将函数写到我的MainWindow
类中,如下所示:
self.window.menuopen_button.clicked.connect(lambda x: self.menu_animation(x))
self.window.minimise_button.clicked.connect(lambda x: self.menu_buttons('minimise'))
解决方案
您的初始代码仅将 UI 文件加载到 QUiLoader 对象中——您无需对它执行任何其他操作。当您调用 时widget.show()
,您调用的是 QMainWindow 的 show 方法,该方法是默认窗口(因此为空),因为您尚未将加载的小部件添加到其中。
您的解决方案类似地加载 UI,但通过小部件对象的 show 方法显示它。但是,您并没有将其修改到主窗口,因此您基本上是在折腾主窗口并仅使用小部件。
有几种方法可以正确完成您想要的:
- 一种方法是,正如@musicamante 建议的那样,将加载的 UI 小部件添加到您的 MainWindow 对象(顺便说一下,PySide2 支持这一点:https : //doc.qt.io/archives/qtforpython-5.12/PySide2/ QtUiTools/QUiLoader.html - 详细描述中的示例准确显示了如何执行此操作)。
- 或者我更喜欢的另一种方式是在构建过程中使用 uic 实用程序 PySide2-uic 来基于 UI 文件生成 UI Python 类。
Qt 文档有显示这两种方法的教程。链接的文档显示 PySide6 对 PySide2 的支持已随着 Qt6 的发布而停止。PySide2、PySide6 和 PyQt5 的 API 都非常相似,因此如果您从 PySide2 或 PyQt 迁移,那么更改应该相对轻松。我推荐使用 PySide6,因为这是 Qt 官方支持的 Python 绑定。
推荐阅读
- sql - 从字符串 sql netezza 中提取字符串
- machine-learning - 子词 NMT 的 BLEU 分数应该在子词上计算还是应该先加入?
- python - 无法在 django 中更新用户个人资料图片
- javascript - JavaScript React 错误:下拉项在单击时保持打开状态
- python - 如何将 Datetime 和 int 功能与 Scikit 学习混合?
- docker - Docker 映像文件夹权限未更新
- linux - 如何从字符串中编辑出特定的输出?
- plot - 以特定的刻度数开始绘图
- mongodb - 为了性能,我应该在 MongoDB 更新命令中具体到什么程度?
- python-3.x - Conda 骨架 pypi:ModuleNotFoundError:没有名为“numpy”的模块