`
sofire
  • 浏览: 143885 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

《Old-style Signal and Slot Support》文档的测试程序

阅读更多

《Old-style Signal and Slot Support》文档的测试程序 

 

#!/usr/bin/env python
#coding:utf8

__version__ = "1.0"

"""
《Old-style Signal and Slot Support》文档的测试程序 
- sofire@gmail.com @2013.02.11
http://pyqt.sourceforge.net/Docs/PyQt4/old_style_signals_slots.html

注意:
1、如果Signal、Slot相关代码写错了,它不会报错,只是不能正确运行。
2、建议学学New Style的写法
"""

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import PyQt4.QtCore as QtCore
import PyQt4.QtGui as QtGui

from PyQt4.QtCore import QVariant

import os, sys, time

from signalDialog import *

def pyFunction():
    print "pyFunction"

def pyFunction2(i):
    print "pyFunction", i

class TestDialog(QDialog):

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

        self.ui = Ui_Dialog()
        self.ui.setupUi(self)

        #定义:bool QObject.connect (QObject, SIGNAL(), callable, Qt.ConnectionType = Qt.AutoConnection)
        #SIGNAL 可以是 Qt Signal,也可以是PyQt Signal
        #  Qt Signal和Slot,是指C++里面静态定义的
        #callable 可以是函数,也可以是类的方法
        QtCore.QObject.connect(self, QtCore.SIGNAL('QtSig_pyFunc()'), pyFunction)
        QtCore.QObject.connect(self, QtCore.SIGNAL('QtSig_pyMethod()'), self.pyMethod)
        QtCore.QObject.connect(self.ui.scrollBar, SIGNAL('valueChanged(int)'), pyFunction2)

        #定义:bool QObject.connect (QObject, SIGNAL(), QObject, SLOT(), Qt.ConnectionType = Qt.AutoConnection)        
        QtCore.QObject.connect(self.ui.scrollBar, SIGNAL('valueChanged(int)'), self.ui.label,  SLOT('setNum(int)'))
        #也可以这样写
        #定义:bool connect (self, QObject, SIGNAL(), SLOT(), Qt.ConnectionType = Qt.AutoConnection)
        #self.ui.label.connect(self.ui.scrollBar, QtCore.SIGNAL('valueChanged(int)'), SLOT('setNum(int)')) 

        #PySig和QtSlot/PySlot的关联
        QtCore.QObject.connect(self, SIGNAL('PySig_qtSlot(int)'), self.ui.label,  SLOT('setNum(int)'))
        QtCore.QObject.connect(self, QtCore.SIGNAL('PySig_pySlot()'), self, QtCore.SLOT('pySlot()'))


        #用PyQt_PyObject -- 它表示参数可以是任意的Python类型
        QtCore.QObject.connect(self, QtCore.SIGNAL('PySig_PyObject(PyQt_PyObject)'), pyFunction2)

        #Short-circuit Signals
        #它没有参数和括号,但是可以传递任何数量和类型的参数给Slot(传递的参数不足会给警告,多余的会丢弃)
        #它隐形定义了各个参数为 PyQt_PyObject
        #注意只能关联到Python的Slots,不能是Qt Slots
        QtCore.QObject.connect(self, QtCore.SIGNAL('PySig2'), pyFunction2)

        #SIGNAL可以和SIGNAL关联
        QtCore.QObject.connect(self, QtCore.SIGNAL('PySig2Sig'), self, QtCore.SIGNAL('PySig2'))

        #一个Sig可以和多个SLots关联
        #一个Slots可以和多个Sig关联
        #可以在线程之间关联

        self.runTest()

    #注意必须用修饰器
    #@QtCore.pyqtSignature()  #已废弃,改用pyqtSlot
    @pyqtSlot() 
    def pySlot(self):
        print "pySlot"

    def runTest(self):
        self.emit(QtCore.SIGNAL('QtSig_pyFunc()'))
        self.emit(QtCore.SIGNAL('QtSig_pyMethod()'))

        self.emit(QtCore.SIGNAL('PySig_qtSlot(int)'), 2)
        self.emit(QtCore.SIGNAL('PySig_pySlot()'))

        self.emit(QtCore.SIGNAL('PySig_PyObject(PyQt_PyObject)'), ('abc', 'def'))
        self.emit(QtCore.SIGNAL('PySig_PyObject(PyQt_PyObject)'), {'a':1, 'b':2})

        self.emit(QtCore.SIGNAL('PySig2'), 1)
        self.emit(QtCore.SIGNAL('PySig2'), (3, 4))
        self.emit(QtCore.SIGNAL('PySig2Sig'), 5)

    def pyMethod(self):
        print "pyMethod"

    

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    form = TestDialog()
    form.show()
    app.exec_()

 

signalDialog.py:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'signalDialog.ui'
#
# Created: Mon Feb 11 17:34:34 2013
#      by: PyQt4 UI code generator 4.9.6
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName(_fromUtf8("Dialog"))
        Dialog.resize(400, 300)
        self.buttonBox = QtGui.QDialogButtonBox(Dialog)
        self.buttonBox.setGeometry(QtCore.QRect(30, 240, 341, 32))
        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
        self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
        self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
        self.scrollBar = QtGui.QScrollBar(Dialog)
        self.scrollBar.setGeometry(QtCore.QRect(20, 20, 160, 16))
        self.scrollBar.setOrientation(QtCore.Qt.Horizontal)
        self.scrollBar.setObjectName(_fromUtf8("scrollBar"))
        self.label = QtGui.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(20, 50, 161, 61))
        font = QtGui.QFont()
        font.setPointSize(22)
        self.label.setFont(font)
        self.label.setObjectName(_fromUtf8("label"))

        self.retranslateUi(Dialog)
        QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept)
        QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(_translate("Dialog", "Dialog", None))
        self.label.setText(_translate("Dialog", "0", None))

 

0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics