2

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 項目にアクセスできないようです。シグナルも送信してみましたが、まだ正しい構文を取得できません。

私の構造が偽物である可能性があるため、ほとんどを投稿しました。基本的に.py、Designer によって作成されたファイルと、それをインポートするメイン プログラム ファイルがあります。メイン プログラム ファイルには、GUI を開始するためのクラス (および個別のウィンドウごとのクラス) があります。このクラスには、クラスのメソッドを呼び出すシグナルがあります。これらのメソッドは、メイン プログラムまたは作成した他のクラスから関数を呼び出します。プログラムの最後にはif __name__ == "__main__"、GUI を起動するためのコードがあります。この構造は偽物ですか?私は多くのチュートリアルをオンラインで読みましたが、すべて異なっていたり、時代遅れでした。

4

1 に答える 1

4

あなたのfunc1方法は道です -uiはクラスのフィールドであるStartQT4ため、同じクラス内でのみそのデータを直接操作する必要があります。1 つのクラスで 1 つのウィジェットのすべてのユーザー インターフェイス機能を使用することは何も悪いことではありません。コードに 2 つのクラスしかない場合は大きな問題ではありませんが、フィールドを直接参照する複数のクラスを使用することは、メンテナンスにとって悪夢になる可能性があります。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_())
于 2013-04-14T15:07:37.887 に答える