【问题标题】:PyQt binding current instance of 'self' to imported UI 'self'PyQt 将“self”的当前实例绑定到导入的 UI“self”
【发布时间】:2017-03-29 11:58:02
【问题描述】:

抱歉,如果我在主题行中试图传达的内容有更正确的行话。

假设我在 Qt 4 Designer 生成的.ui 文件上使用pyuic 并将其保存为gui.py。因为我不应该修改 # WARNING!在此文件中所做的所有更改都将丢失!,在另一个源文件中,我从 gui.pyfrom gui import Ui_MainWindow 导入 Ui_MainWindow。我将QMainWindow 子类化并将uigui.pyself.ui = Ui_MainWindow() 设置为主窗口并使用self.setupUi(self) 进行设置。我的问题是自动完成现在无法识别当前文件中来自gui.py 的变量。

我将如何设置编辑器,以便当我键入 self 以分别填充结果时。

form_class = uic.loadUiType("qt_designed_ui.ui")[0]

class MyWindowClass(QMainWindow, form_class):    

    def __init__(self, parent=None):
        super().__init__(parent)

        # bind this subclassed code based UI to the actual UI made with Qt Designer 4
        self.ui = Ui_MainWindow()
        self.setupUi(self)

通过上述方式,self.ui.var 之类的内容将为var 提供自省,但这是非法语句。我必须使用self.var,这是合法的,但不提供内省。此外,我知道self.var 有效,因为整个应用程序都有效,并且我使用该表单处理类的许多属性,我只是缺乏对 PyCharm 的自省。

【问题讨论】:

  • 你是说 PyCharm 没有对 self.ui 应用适当的内省吗?
  • @Crispin 不,在我的QMainWindow 子类中的self,它使用pyuic 生成的gui.py 的内容初始化它的ui。使用self.ui 前缀寻址变量不起作用,我必须只使用self,它不提供自省。不过奇怪的是,它确实提供了对self.ui 的内省。
  • 我很困惑。也许一些示例代码会有所帮助。标准约定是继承QMainWindow 并设置self.ui = Ui_MainWindow()。这是你在做什么?
  • @Crispin 我已经添加了我正在使用的代码。
  • super(MyWindowClass).__init__(parent) ?

标签: qt python-3.x autocomplete pyqt


【解决方案1】:

我更喜欢单继承方法:

from gui import Ui_MainWindow

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

通过self.uiQMainWindow 通过self 进行自省:

UI 组件是Ui_MainWindow 实例的成员,因此通过self.ui 访问它们:

self.text_save = self.ui.txt_save

【讨论】:

  • 如果我将self.setupUi(self) 更改为self.ui.setupUi(self),我会得到AttributeError: 'MyWindowClass' object has no attribute 'txt_save' 的单继承和多继承。与我原来的setupUi() 的单一继承抛出AttributeError: 'MyWindowClass' object has no attribute 'setupUi'。经过测试,我认为这可能与使用uic的多重继承有关
  • 使用以下命令创建gui.pypyuic4 qt_designed_ui.ui > gui.py
  • 我也有。我最初将它与多重继承一起使用。我之前发布代码时刚刚忘记了它。
  • 为什么不发布运行该命令后gui.py 的样子?
  • 我想我现在开始了解更多了。从form_class 继承<class 'Ui_MainWindow'> 是为什么它允许我合法地做self.var,但我认为它不提供内省,因为变量直到运行时才在范围内或可能的东西。如果我没记错的话,它会开始在外部范围内寻找变量。无论如何,似乎我的问题在将其更改为您的问题后解决了,只是将所有 self.var 实例更改为 self.ui.var 并以这种方式使用它。谢谢克里斯平。
猜你喜欢
  • 1970-01-01
  • 2013-04-22
  • 2012-08-13
  • 2017-09-01
  • 2021-05-19
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
相关资源
最近更新 更多