【问题标题】:Python signals and slots between classes类之间的 Python 信号和槽
【发布时间】:2014-08-18 02:30:51
【问题描述】:

我正在尝试让 Python/PyQt 中的 Gui 应用程序具有一个 sliderDialog 类,以通过信号将缩放器列表发送到 MainWindow 并发出 .... 但以下代码不起作用。滑块改变值......但 MainWindow 看不到信号,我认为发出会通知 MainWindow。但不是。帮助?哦 - 我知道我还没有设置传递缩放器值,但由于信号不起作用,所以不追求这个。

from PyQt4 import QtCore
from PyQt4 import QtGui

OFFSET_Y = 15
OFFSET_X = 5
SPACER_Y = 20
SPACER_X = 50
switch = [1.0, 2.0, 3.0, 6.0, 9.0, 12.0, 18.0]

class MainWindow(QtGui.QMainWindow):

    sliderUpdate = QtCore.SIGNAL('sliderUpdate()')

    def __init__(self):
        super(MainWindow, self).__init__()
        sdlg = SliderDialog(self, 5)
        sdlg.connect(self, QtCore.SIGNAL('sliderUpdate'), self.scalers)
        sdlg.show()

    def scalers(self) :
        print "In scalers of MainWindow!"

class SliderDialog(QtGui.QDialog) :

    sliderMoved  = QtCore.pyqtSignal()

    def __init__( self, parent, dataCount ) :
        super(SliderDialog, self).__init__(parent)

        sliderLayout = QtGui.QVBoxLayout()
        sliderLayout.addStretch()

        self.slider = []
        self.sliderLabel = []
        for i in range(dataCount) :

            s = QtGui.QSlider(QtCore.Qt.Horizontal, self)
            s.setMinimum(0)
            s.setMaximum(len(switch)-1)
            s.setTickInterval(1)
            s.setSingleStep(1)
            s.move(170, OFFSET_Y+30 + 3*SPACER_Y*i)
            s.sliderReleased.connect(self.sliderMoved)

            sl = QtGui.QLabel("Scaling to : 1.0", self)
            sl.move(5, OFFSET_Y+30 + 3*SPACER_Y*i)

            self.slider.append(s)
            self.sliderLabel.append(sl)

            sliderLayout.addWidget(self.slider[i])
            sliderLayout.addWidget(self.sliderLabel[i])

    def sliderMoved(self) :
        for i, slides in enumerate(self.slider) :
            scaler = slides.sliderPosition()
            self.sliderLabel[i].setText("Scaling to: {}".format(switch[scaler]))
            self.emit(QtCore.SIGNAL('sliderUpdate'))

if __name__ == '__main__':

    import sys

    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

【问题讨论】:

  • 您在SliderDialog 中定义了一个信号和一个槽,称为sliderMoved,并且似乎混合了信号和槽的旧式和新式语法。
  • SliderMoved 仅用于 SliderDialog 处理事件。您是说这会导致类之间的信号出现问题吗?

标签: python qt pyqt


【解决方案1】:

问题是你的put参数'connect'错误;

bool QObject.connect (QObject, SIGNAL(), callable, Qt.ConnectionType = Qt.AutoConnection)

参数:

1. QObject  : Source object to receive emit signal

2. SIGNAL() : Signal name

3. callable : Callable do your want go it then have signal from source object

4. (Optional)

要修复它们,请在正确的位置更改正确的参数。

从;

sdlg.connect(self, QtCore.SIGNAL('sliderUpdate'), self.scalers)

到;

self.connect(sdlg, QtCore.SIGNAL('sliderUpdate'), self.scalers)

参考http://pyqt.sourceforge.net/Docs/PyQt4/qobject.html#connect-2


LAST EDITED 18 / 8/ 2014 11 : 37 :添加完整代码;

from PyQt4 import QtCore
from PyQt4 import QtGui

OFFSET_Y = 15
OFFSET_X = 5
SPACER_Y = 20
SPACER_X = 50
switch = [1.0, 2.0, 3.0, 6.0, 9.0, 12.0, 18.0]

class MainWindow(QtGui.QMainWindow):

    sliderUpdate = QtCore.SIGNAL('sliderUpdate()')

    def __init__(self):
        super(MainWindow, self).__init__()
        sdlg = SliderDialog(self, 5)
        self.connect(sdlg, QtCore.SIGNAL('sliderUpdate'), self.scalers)
        sdlg.show()

    def scalers(self) :
        print "In scalers of MainWindow!"

class SliderDialog(QtGui.QDialog) :

    sliderMoved  = QtCore.pyqtSignal()

    def __init__( self, parent, dataCount ) :
        super(SliderDialog, self).__init__(parent)

        sliderLayout = QtGui.QVBoxLayout()
        sliderLayout.addStretch()

        self.slider = []
        self.sliderLabel = []
        for i in range(dataCount) :

            s = QtGui.QSlider(QtCore.Qt.Horizontal, self)
            s.setMinimum(0)
            s.setMaximum(len(switch)-1)
            s.setTickInterval(1)
            s.setSingleStep(1)
            s.move(170, OFFSET_Y+30 + 3*SPACER_Y*i)
            s.sliderReleased.connect(self.sliderMoved)

            sl = QtGui.QLabel("Scaling to : 1.0", self)
            sl.move(5, OFFSET_Y+30 + 3*SPACER_Y*i)

            self.slider.append(s)
            self.sliderLabel.append(sl)

            sliderLayout.addWidget(self.slider[i])
            sliderLayout.addWidget(self.sliderLabel[i])

    def sliderMoved(self) :
        for i, slides in enumerate(self.slider) :
            scaler = slides.sliderPosition()
            self.sliderLabel[i].setText("Scaling to: {}".format(switch[scaler]))
            self.emit(QtCore.SIGNAL('sliderUpdate'))

if __name__ == '__main__':

    import sys

    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

问候,

【讨论】:

  • 嗯,这有点道理。但不幸的是,对代码的修改并没有纠正它。我没有看到 MainWindow 调用缩放器并因此打印一条消息。 Arigatoo
  • Ummm...,我认为应该解决(或者我错过了什么?)。请运行我的修改代码,看看有什么不同。谢谢。 (Arigatoo -> ありがと)
  • '如何传递列表值?'答:您只需在滑块位置获得所有值并像您所做的那样放入发射。 'self.emit(QtCore.SIGNAL('sliderUpdate'), listsValue)' 并忘记将其传递给目标方法'def scalers(self, listsValue) :'。
猜你喜欢
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-06
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
相关资源
最近更新 更多