从GUI类外部访问GUI元素

时间:2013-04-14 14:52:44

标签: python qt pyqt qt-designer

我希望有人可以帮我解决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 个答案:

答案 0 :(得分:4)

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

但是,如果您确实要从func2进行编辑,则需要将StartQT4对象的引用传递给它,因为您需要指定实例窗口>您需要更改状态栏消息。

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_())