从 GUI 类外部访问 GUI 元素

Posted

技术标签:

【中文标题】从 GUI 类外部访问 GUI 元素【英文标题】:Accessing GUI elements from outside the GUI class 【发布时间】:2013-04-14 14:52:44 【问题描述】:

我希望有人可以帮助我解决 Qt 设计器问题。我正在尝试从调用 GUI 文件的类外部修改 GUI 元素。我已经设置了显示我的程序结构的示例代码。我的目标是获取func2,在主程序(或其他类)中更改主窗口的状态栏。

from PyQt4 import QtCore, QtGui
from main_gui import Ui_Main
from about_gui import Ui_About
#main_gui and about_gui are .py files generated by designer and pyuic

class StartQT4(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_Main()
        self.ui.setupUi(self)

        self.ui.actionMyaction.triggered.connect(self.func1)
    #Signals go here, and call this class's methods, which call other methods.
        #I can't seem to call other methods/functions directly, and these won't take arguments.

    def func1(self):
    #Referenced by the above code. Can interact with other classes/functions.
        self.ui.statusbar.showMessage("This works!")


def func2(self):
   StartQT4.ui.statusbar.showMessage("This doesn't work!")
    #I've tried many variations of the above line, with no luck.

#More classes and functions not directly-related to the GUI go here; ie the most of the program.

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = StartQT4()
    myapp.show()
    sys.exit(app.exec_())

我正在尝试让func2 工作,因为我不希望我的整个程序都在 StartQT4 类之下。我已经尝试了该行的许多变体,但似乎无法从此类外部访问 GUI 项。我也尝试过发送信号,但仍然无法正确使用语法。

我的结构可能是伪造的,这就是我发布大部分内容的原因。本质上,我有一个由 Designer 创建的 .py 文件和我的主程序文件,它可以导入它。主程序文件有一个启动 GUI 的类(以及每个单独窗口的一个类)。它在这个类中有信号,调用类中的方法。这些方法从我的主程序或我创建的其他类中调用函数。程序末尾有if __name__ == "__main__" 代码,用于启动GUI。这种结构是假的吗?我在网上读过很多教程,都不同,或者过时了。

【问题讨论】:

【参考方案1】:

您的func1 方法是一种可行的方法——因为uiStartQT4 类中的一个字段,您应该只在同一个类中直接使用它的数据进行操作。在一个类中拥有一个小部件的所有用户界面功能并没有错 - 如果您的代码中只有两个类,这不是一个大问题,但是有几个类来直接引用字段对于维护来说是潜在的噩梦(什么如果您更改了statusbar 小部件的名称?)。

但是,如果您真的想从func2 编辑它,那么您需要将StartQT4 对象的引用传递给它,因为您需要指定您的窗口的instance需要更改状态栏消息。

def func2(qtWnd): # Self should go here if func2 is beloning to some class, if not, then it is not necessary
   qtWnd.ui.statusbar.showMessage("This should work now!")

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = StartQT4()
    myapp.show()
    func2(myapp)
    sys.exit(app.exec_())

【讨论】:

谢谢。您描述引用类的 instance 的答案解决了我的问题。用“myapp”替换func2中的“StartQT4”解决了这个问题。 我还采纳了您关于将实例作为参数传递的建议。

以上是关于从 GUI 类外部访问 GUI 元素的主要内容,如果未能解决你的问题,请参考以下文章

Python,从类外部访问小部件项

当从外部对象调用方法时,qt 的 gui 线程是不是会在后台生成线程?

WPF 从其他线程访问 GUI

在 C++ 中从外部访问嵌套类

如何从 GUI 中的编辑框中检索数据

如何从 Kotlin 的内部类访问外部类的成员?