2

ボタンがクリックされたときにビューがカスタム信号を発行し、コントローラーのメソッドの1つが発行された信号に接続されているPyQtでビューとコントローラーを作成しようとしています。ただし、機能しません。ボタンをクリックしても応答メソッドが呼び出されません。私が何を間違えたのか分かりますか?

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import QPushButton, QVBoxLayout, QDialog, QApplication 

class TestView(QDialog):
    def __init__(self, parent=None):
        super(TestView, self).__init__(parent)
        self.button = QPushButton('Click')
        layout = QVBoxLayout()
        layout.addWidget(self.button)
        self.setLayout(layout)
        self.connect(self.button, SIGNAL('clicked()'), self.buttonClicked)

    def buttonClicked(self):
        self.emit(SIGNAL('request'))

class TestController(QObject):
    def __init__(self, view):
        self.view = view
        self.connect(self.view, SIGNAL('request'), self.respond)

    def respond(self):
        print 'respond'

app = QApplication(sys.argv)
dialog = TestView()
controller = TestController(dialog)
dialog.show()
app.exec_()
4

1 に答える 1

4

私にとってはうまくいきます-使用しているQt/PyQtのバージョンかもしれませんが、試すことができることがいくつかあります:

  1. 適切なメソッド構文を使用してください - SIGNAL('request()') 対 SIGNAL('request')
  2. 新しいスタイルのシグナル構文を使用する

使用しているスタイルは古いスタイルの PyQt 構文であり、新しいスタイルのシグナル/スロット定義が推奨されます。

import sys
from PyQt4.QtCore import QObject, pyqtSignal  # really shouldn't import * here...QtCore library is quite large
from PyQt4.QtGui import QPushButton, QVBoxLayout, QDialog, QApplication 

class TestView(QDialog):
    request = pyqtSignal()

    def __init__(self, parent=None):
        super(TestView, self).__init__(parent)
        self.button = QPushButton('Click')
        layout = QVBoxLayout()
        layout.addWidget(self.button)
        self.setLayout(layout)
        self.button.clicked.connect(self.buttonClicked)

    def buttonClicked(self):
        self.request.emit()

class TestController(QObject):
    def __init__(self, view):
        super(QObject, self).__init__()
        self.view = view
        self.view.request.connect(self.respond)

    def respond(self):

        print 'respond'

app = QApplication(sys.argv)
dialog = TestView()
controller = TestController(dialog)
dialog.show()
app.exec_()

繰り返しますが、この方法でコードを構築することは本当にお勧めしません...必要のないときに、多くの不要な作業とオブジェクトの複製を作成しています。

于 2012-09-05T07:42:28.850 に答える