国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

PyQt4 信號和槽用法總結

2019-11-08 03:11:54
字體:
來源:轉載
供稿:網友
原文地址

原文 http://neteue.com/article/pyqt4-signal-slot/

信號與槽的例子

可以使用QObject.connect方法來連接信號與槽

#! /usr/bin/env python# -*- coding: utf-8 -*-from PyQt4 import QtCore, QtGuiclass MyWidget(QtGui.QWidget): def __init__(self, parent=None): super(MyWidget, self).__init__(parent) self.quit_button = QtGui.QPushButton("Quit", self) layout = QtGui.QHBoxLayout() layout.addWidget(self.quit_button) self.setLayout(layout) self.connect(self.quit_button, QtCore.SIGNAL("clicked()"), QtGui.qApp, QtCore.SLOT("quit()"))if __name__ == '__main__': import sys app = QtGui.Qapplication(sys.argv) win = MyWidget() win.show() sys.exit( app.exec_() )12345678910111213141516171819202122231234567891011121314151617181920212223

在這個例子中, 使用了標準的連接方式connect(發送者, 信號, 接收者, 槽), Qt中的槽可以這樣理解: 是接收者中經過包裝后某個方法

自定義槽(slot)

當然可以通過QtCore.pyqtSlot自義一個槽, 在舊式風格中使用是的pyqtSignature, 建議使用pyqtSlot

#! /usr/bin/env python# -*- coding: utf-8 -*-from PyQt4 import QtCore, QtGuiclass MyWidget(QtGui.QWidget): def __init__(self, parent=None): super(MyWidget, self).__init__(parent) self.ok_button = QtGui.QPushButton("OK", self) layout = QtGui.QHBoxLayout() layout.addWidget(self.ok_button) self.setLayout(layout) self.connect(self.ok_button, QtCore.SIGNAL('clicked()'), self, QtCore.SLOT("on_ok_button_clicked()")) @QtCore.pyqtSlot() def on_ok_button_clicked(self): PRint "OK"if __name__ == "__main__": import sys app = QtGui.QApplication(sys.argv) w = MyWidget() w.show() app.exec_()1234567891011121314151617181920212223242526272812345678910111213141516171819202122232425262728

發送信號

單擊按鈕后觸發emit_python_list信號, 并且執行相應的槽

#! /usr/bin/env python# -*- coding: utf-8 -*-from PyQt4 import QtCore, QtGuiclass MyWidget(QtGui.QWidget): def __init__(self, parent=None): super(MyWidget, self).__init__(parent) self.ok_button = QtGui.QPushButton("OK", self) layout = QtGui.QHBoxLayout() layout.addWidget(self.ok_button) self.setLayout(layout) self.connect(self.ok_button, QtCore.SIGNAL("clicked()"), self, QtCore.SLOT("slot1()")) self.connect(self, QtCore.SIGNAL('emit_python_list(PyQt_PyObject)'), self, QtCore.SLOT("slot2(PyQt_PyObject)")) @QtCore.pyqtSlot() def on_button_clicked(self): print "click me!!!!" @QtCore.pyqtSlot() def slot1(self): self.emit(QtCore.SIGNAL("emit_python_list(PyQt_PyObject)"), [1, 2, 3, 4, 5, 6]) @QtCore.pyqtSlot("PyQt_PyObject") def slot2(self, alist): print alistif __name__ == "__main__": import sys app = QtGui.QApplication(sys.argv) w = MyWidget() w.show() app.exec_()12345678910111213141516171819202122232425262728293031323334353637381234567891011121314151617181920212223242526272829303132333435363738

執行Python方法

這里使用更加優雅直接的方式連接信號并執行回調, 這也是項目中用到最多的方式

#! /usr/bin/env python# -*- coding: utf-8 -*-from PyQt4 import QtCore, QtGuiclass MyWidget(QtGui.QWidget): def __init__(sel`f, parent=None): super(MyWidget, self).__init__(parent) self.ok_button = QtGui.QPushButton("ok", self) layout = QtGui.QHBoxLayout() layout.addWidget(self.ok_button) self.setLayout(layout) self.ok_button.clicked.connect(self.on_ok_button_clicked) def on_ok_button_clicked(self): print "OK"if __name__ == '__main__': import sys app = QtGui.QApplication(sys.argv) win = MyWidget() win.show() sys.exit( app.exec_() )12345678910111213141516171819202122232425261234567891011121314151617181920212223242526

self.ok_button.clicked.connect 其中clicked是信號

注冊信號

#! /usr/bin/env python# -*- coding: utf-8 -*-from PyQt4 import QtCore, QtGuiclass MyWidget(QtGui.QWidget): emit_python_list = QtCore.pyqtSignal(object) def __init__(self, parent=None): super(MyWidget, self).__init__(parent) self.ok_button = QtGui.QPushButton("OK", self) layout = QtGui.QHBoxLayout() layout.addWidget(self.ok_button) self.setLayout(layout) self.ok_button.clicked.connect(self.slot1) self.emit_python_list.connect(self.slot2) def slot1(self): self.emit_python_list.emit([1, 2, 3, 4, 5, 6]) def slot2(self, alist): print alistif __name__ == "__main__": import sys app = QtGui.QApplication(sys.argv) w = MyWidget() w.show() app.exec_()12345678910111213141516171819202122232425262728293031321234567891011121314151617181920212223242526272829303132

自動連接

QMetaObject. connectSlotsByName(QObject)

其作用是如其名稱一樣,用來將QObject 里的子孫QObject的某些信號按照其objectName連接到相應的槽上,

如是使用pyuic生成的代碼, 就是使用這種方式

#! /usr/bin/env python# -*- coding: utf-8 -*-from PyQt4 import QtCore, QtGuiclass MyWidget(QtGui.QWidget): def __init__(self, parent=None): super(MyWidget, self).__init__(parent) self.ok_button = QtGui.QPushButton("OK", self) self.ok_button.setObjectName("ok_button") layout = QtGui.QHBoxLayout() layout.addWidget(self.ok_button) self.setLayout(layout) QtCore.QMetaObject.connectSlotsByName(self) @QtCore.pyqtSlot() # 一定要有,不然會打印兩遍 "OK" def on_ok_button_clicked(self): print "OK"if __name__ == "__main__": import sys app = QtGui.QApplication(sys.argv) w = MyWidget() w.show() app.exec_()12345678910111213141516171819202122232425262728291234567891011121314151617181920212223242526272829

別忘了, 使用setObjectName設置對象名稱


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新竹县| 四会市| 济南市| 阳原县| 广昌县| 乌鲁木齐县| 泰兴市| 承德县| 民乐县| 库尔勒市| 马鞍山市| 额济纳旗| 大丰市| 行唐县| 宁阳县| 阿瓦提县| 信丰县| 铅山县| 宿州市| 萍乡市| 沙田区| 随州市| 宁津县| 崇明县| 松潘县| 阿尔山市| 萨嘎县| 女性| 军事| 中牟县| 陆良县| 平顶山市| 崇信县| 通化市| 皋兰县| 临高县| 南华县| 汤阴县| 云安县| 安康市| 九台市|