【发布时间】:2022-01-21 01:52:18
【问题描述】:
假设我在 Qt Designer 中创建了一个 ui 文件,我想动态加载该文件以操作小部件,例如:
example.py:
from PyQt5 import QtWidgets, uic
class MyWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(MyWidget, self).__init__(parent)
uic.loadUi('example.ui', self)
# No code completion here for self.myPushButton:
self.myPushButton.clicked.connect(self.handleButtonClick)
self.show()
在 PyCharm (2017.1.4) 中以这种方式加载的小部件是否有标准/便捷的方式来启用代码完成?
目前我正在使用这个(在ui文件加载后写在构造函数中):
self.myPushButton = self.myPushButton # type: QtWidgets.QPushButton
# Code completion for myPushButton works at this point
我也想过这个,但是好像不行:
assert isinstance(self.myPushButton, QtWidgets.QPushButton)
# PyCharm does not even recognise myPushButton as an attribute of self at this point
最后我也想到了用python stubs,比如:
example.pyi:
class MyWidget(QtWidgets.QWidget):
def __init__(self):
self.myPushButton: QtWidgets.QPushButton = ...
但是,myPushButton 在 example.py 外部的代码中被正确识别,但在 example.py 本身的代码中却没有被正确识别,这与我想要的相反。
我也在考虑采用我的第一种方法,但所有这些行都放在一个永远不会被调用的私有方法中,例如:
example.py:
from PyQt5 import QtWidgets, uic
class MyWidget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(MyWidget, self).__init__(parent)
uic.loadUi('example.ui', self)
# Code completion now works here for self.myPushButton:
self.myPushButton.clicked.connect(self.handleButtonClick)
self.show()
def __my_private_method_never_called():
self.myPushButton = self.myPushButton # type: QtWidgets.QPushButton
# Or even this (it should have the same effect if this
# function is never called, plus it is less verbose):
self.myPushButton = QtWidgets.QPushButton()
# If I want to make sure that this is never called
# could raise an error at some point:
raise YouShouldNotHaveCalledThisError()
这似乎工作正常,它还允许我将所有类型提示代码组合在一起,与其他代码隔离。我什至可以通过解析 ui 文件来编写一些脚本来为我编写所有这些行。我只是想知道阅读我的代码的人是否会觉得这种方法非常不正统,即使我清楚地评论了为什么我要编写一个技术上无用的私有函数。
【问题讨论】:
-
Pycharm 无法识别 .ui 文件