Python类之间的信号与槽
我正在尝试用Python/PyQt制作一个图形界面应用程序,想要创建一个滑块对话框类,通过信号把一组缩放值发送到主窗口。但是,下面的代码没有成功。滑块的值确实在变化……但是主窗口并没有接收到信号,我原以为发出信号就能通知主窗口。结果并不是这样。有人能帮忙吗?哦,我知道我还没有设置好传递缩放值的部分,但由于信号没有工作,所以我也没继续这个部分。
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_())
1 个回答
1
问题在于你使用的'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
最后编辑于 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_())
祝好,