【问题标题】:Signal Not coming though - PySide信号没有来 - PySide
【发布时间】:2014-08-21 14:57:40
【问题描述】:

我正在从另一个类发送一个信号来更新 PySide QTableWidget,但什么都没有发生。我为这个演示做了一个非常简单的操作:

这是在名为Records.py的控制器模块中

class Records(QDialog, randomDialog.Ui_watchingDialog):

    signal = 1
    atSig = Signal(int)

    def add_button_clicked(self):

        # Do some stuff
        self.signal = 1
        self.atSig.emit(self.signal)
        # Do some other Stuff

它位于名为main.py的控制器之外

from controller import Records

class main(QMainWindow, pyMainWindow.Ui_mainWindow):

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

        signal_records = Records.Records()

        signal_records.atSig.connect(self.showNewData)


    def showNewData(self, signal):
        if signal == 1:
            print "It worked!"
        else:
            print "Problem"

这个信号怎么没有通过?没有抛出错误消息,也没有调用任何打印语句。我该如何解决这个问题?

【问题讨论】:

  • 你确定'def add_button_clicked(self):'有电话吗?我使用我的 pyqt4,它工作正常。

标签: python pyqt pyside


【解决方案1】:

signal_records 一旦main.__init__() 返回并被垃圾回收,就会超出范围。您需要使其成为 main 的成员,以便它在类的生命周期内持续存在。

self.signal_records = Records.Records()
self.signal_records.atSig.connect(self.showNewData)

或者,您可以将main 指定为signal_records 的父级

signal_records = Records.Records(self)

这两种方法都可以确保对 signal_records 的引用始终存在。

【讨论】:

  • 我不这么认为。自己不清楚。仅由班级的父母明确删除。
  • 这就是@user3077627 的代码中发生的事情。您的代码工作的原因是因为您为对话框分配了一个父级,该对话框保留了一个引用。在 PyQt/Pyside 的情况下,这与使其成为类成员的效果相同。
【解决方案2】:

如果可能,请在来电者接收之前定义它;

.
.
@Slot (int)
def showNewData(self, signal):
.
.

否则,请检查您的来电者def add_button_clicked(self)。我在 pyqt4(相同的 pySide)中工作,并且(我删掉了一些部分并在你的代码中放置了一些测试路径),它的工作。

import sys  
from PyQt4 import QtCore  
from PyQt4 import QtGui  

class QRecordsDialog (QtGui.QDialog):
    addButtonClickedSignal = QtCore.pyqtSignal(int)

    def __init__ (self, parent = None):
        super(QRecordsDialog, self).__init__(parent)
        self.myQPushButton = QtGui.QPushButton('Test Signal', self)
        self.myQHBoxLayout = QtGui.QHBoxLayout()
        self.myQHBoxLayout.addWidget(self.myQPushButton)
        self.setLayout(self.myQHBoxLayout)
        self.myQPushButton.clicked.connect(self.addButtonClicked)

    def addButtonClicked (self):
        self.addButtonClickedSignal.emit(1)

class QMainWindow (QtGui.QMainWindow):
    def __init__ (self, parent = None):
        super(QMainWindow, self).__init__(parent)
        myQRecordsDialog = QRecordsDialog(self)
        myQRecordsDialog.addButtonClickedSignal.connect(self.showNewData)
        myQRecordsDialog.show()

    @QtCore.pyqtSlot(int)
    def showNewData (self, signal):
        if signal == 1:
            print "It worked !"
        else:
            print "Problem ?"

myQApplication = QtGui.QApplication(sys.argv)
myQMainWindow = QMainWindow()
myQMainWindow.show()
sys.exit(myQApplication.exec_())

如果你想修改你的 PyQt 代码以使用 PySide 命名方案,可以使用一个简单的定义来完成:

QtCore.Signal = QtCore.pyqtSignal
QtCore.Slot = QtCore.pyqtSlot

Reference this


问候,

【讨论】:

    猜你喜欢
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    相关资源
    最近更新 更多