Python类之间的信号和插槽

2024-10-04 05:19:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用Python/PyQt开发一个Gui应用程序,它有一个sliderDialog类,通过信号和emits向主窗口发送一个scaler列表。。。。但是下面的代码不起作用。滑块改变值。。。但是主窗口看不到信号,我以为发射会通知主窗口。但不,救命?哦-我知道我没有设置传递缩放器的值,但是由于信号不起作用,所以不去跟踪它。在

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_())

Tags: importself信号initdefoffsetsliderqtgui
1条回答
网友
1楼 · 发布于 2024-10-04 05:19:53

问题是你的put参数“connect”错误

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

参数:

^{pr2}$

要解决这些问题,请在正确的位置更改正确的参数。在

^{3}$

收件人:

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

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


上次编辑时间:2014年8月18日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_())

谨致问候

相关问题 更多 >