3

質問から始めて、説明しようとします。インポートされたモジュールが、それをインポートするモジュール内の関数を呼び出す方法はありますか?

私はQtの使い方を学んでいて、QtDesignerから始めていくつかの基本を理解しています。

複数のウィンドウのコードを取得するために複数の「.ui」ファイルを作成する方法を理解し、2つのウィンドウのコードをインポートすることでメインアプリケーションから複数のウィンドウを呼び出す方法を理解しました。

たとえば、win1.uiとwin2.uiから始めて、win1.pyとwin2.pyを作成します。メインアプリケーションからwin1とwin2をインポートします...

注-私はこの簡単なチュートリアルに従うことでこれまでに到達しました:http ://www.youtube.com/watch?v = bHsC6WJsK-U&list = PLF4575388795F2531&index = 10&feature = plpp_video

OK-質問です。win2にボタンがある場合、そのボタンをwin2.pyコードの関数にリンクする方法を知っています。方法がわからないのは、win2のボタンをメインアプリケーションの関数にリンクすることです。

私の唯一の考えは、2番目のウィンドウを設定するクラスに引数として関数を追加することですが、そうすると、win2.uiに変更を加えると、変更したコードが破壊されます。

したがって、インポートされたモジュールが、それをインポートするモジュール内の関数を呼び出す方法はありますか?

あまり関係のないコードを追加しなくても、これが明確になることを願っています...

4

1 に答える 1

4

Qtは、イベント駆動型プログラミングに基づいています。一般に、ウィジェットの作成を開始するとき、実行したいのは、信号を介して受信側ウィジェットに情報を提供し、それを処理することです。子ウィジェットに明示的に知らせたり、親ウィジェットのメソッドを呼び出すように要求したりする必要はありません(これは常に当てはまるわけではありませんが、可能な場合は避けることをお勧めします)。

ここでは、簡単にするためにUIファイルがない例をいくつか投稿しますが、デザイナーを使用して同じウィジェットを作成し、同じように機能させることができると仮定します...

testwidget.py

from PyQt4 import QtGui, QtCore

class TestWidget(QtGui.QWidget):
    textSaved = QtCore.pyqtSignal(str)

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

        # create the ui (or load it)
        self.__edit   = QtGui.QTextEdit(self)
        self.__button = QtGui.QPushButton(self)
        self.__button.setText('Save')

        layout = QtGui.QVBoxLayout()
        layout.addWidget(self.__edit)
        layout.addWidget(self.__button)
        self.setLayout(layout)

        # create connections
        self.__button.clicked.connect(self.emitTextSaved)

    def emitTextSaved( self ):
        # allow Qt's blocking of signals paradigm to control flow
        if ( not self.signalsBlocked() ):
            self.textSaved.emit(self.__edit.toPlainText())

testwindow.py

from PyQt4 import QtGui, QtCore
import testwidget

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

        # create the ui (or load it)
        self.__editor = testwidget.TestWidget(self)
        self.setCentralWidget(self.__editor)

        # create connections
        self.__editor.textSaved.connect(self.showMessage)

    def showMessage( self, message ):
        QtGui.QMessageBox.information(self, 'Message', message)

したがって、ここでは、「TestWidgetのボタンをクリックすると、TestWindowにメッセージを表示したい」というように考えるのではなく、2つのメソッドを明示的にリンクすると、TestWidgetが出力するシグナルを公開することがわかります。ユーザーがアクションを実行してから、その信号をTestWindowのshowMessageスロットに接続します。このようにして、小さなウィジェットはより独立したものになり、アプリケーションを駆動する各イベントにどのように接続するかが問題になります。

TestWidgetのemitTextSavedメソッド内でself.parent()。showMessage(self .__ edit.toPlainText())のようなことを実行して、メソッドを直接呼び出すこともできますが、これは適切な設計ではありません。

于 2012-08-21T19:10:28.033 に答える