2

我正在尝试在 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 回答