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())のようなことを実行して、メソッドを直接呼び出すこともできますが、これは適切な設計ではありません。