S.R*_*S.R 2 python qt pyqt python-3.x pyqt5
我想发出定义的信号:
finished = pyqtSignal(dict)
# other place it's connected to function:
def finised(self, dict_result):
Run Code Online (Sandbox Code Playgroud)
我称它为self.finished.emit({"bk": {}})有效.
现在我打电话给它,self.finished.emit({2: {}})它不起作用!!
回溯(最近调用最后一次):文件"/home/sylwek/workspace/t2-pv/Manager.py",第452行,运行self.finished.emit({2:{}})TypeError:TesterManager.finished [ dict] .emit():参数1有意外类型'dict'
这是正常的吗?我可以改变{2: {}},{'2': {}}但我想了解为什么,并确保没有其他惊喜!
我使用PyQt 5.8.2-2和python 3.6.1-1
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QApplication
class Emiterer(QtCore.QThread):
f = QtCore.pyqtSignal(dict)
def __init__(self):
super(Emiterer, self).__init__()
def run(self):
self.f.emit({"2": {}})
# self.f.emit({2: {}}) < == this don't work!
class Main(QtWidgets.QMainWindow):
def __init__(self):
super(Main, self).__init__()
self.e = Emiterer()
self.e.f.connect(self.finised)
self.e.start()
def finised(self, r_dict):
print(r_dict)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
m = Main()
m.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
Ale*_*vec 10
使用object替代dict的pyqtSignal定义.例如
class Emiterer(QtCore.QThread):
f = QtCore.pyqtSignal(object)
Run Code Online (Sandbox Code Playgroud)
这样做的原因是定义的信号pyqtSignal(dict)实际上与pyqtSignal('QVariantMap')PyQt5和QVariantMap的解释相同,只能将字符串作为键.
您可以查看(针对您的特定课程)
m = Emiterer.staticMetaObject
method = m.method(m.methodCount() - 1) # the last defined signal or slot
print(method.methodSignature())
Run Code Online (Sandbox Code Playgroud)
这会打印出来 PyQt5.QtCore.QByteArray(b'f(QVariantMap)')
| 归档时间: |
|
| 查看次数: |
3522 次 |
| 最近记录: |