gpt4 book ai didi

python - PyQt4 信号和槽

转载 作者:太空狗 更新时间:2023-10-29 22:00:10 24 4
gpt4 key购买 nike

我正在使用 PyQt4 编写我的第一个 Python 应用程序。我有一个 MainWindow 和一个 Dialog 类,它们是 MainWindow 类的一部分:

self.loginDialog = LoginDialog();

我使用插槽和信号。这是在 MainWindow 中建立的连接:

QtCore.QObject.connect(self.loginDialog, QtCore.SIGNAL("aa(str)"), self.login)

然后我尝试在 Dialog 类中发出信号(我确定它已发出):

self.emit(QtCore.SIGNAL("aa"), "jacek")

不幸的是,槽没有被调用。我也尝试了不带参数的不同风格的发射信号。没有错误,代码中没有警告。可能是什么问题?

最佳答案

有一些概念需要澄清

[QT信号槽] VS [Python信号槽]

pyqt提供的所有预定义信号槽都是由QT的c++代码实现的。每当你想在 Python 中有一个自定义的信号和槽时,它就是一个 python 信号和槽。因此有四种情况向插槽发出信号:

  • 从 QT 信号到 QT 槽
  • 从 QT 信号到 Python 插槽
  • 从 Python 信号到 QT 槽
  • 从 Python 信号到 Python 插槽

下面的代码展示了如何连接这四种不同的场景

    import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class Foo(QtCore.QObject):

def __init__(self, parent=None):
super(Foo, self).__init__(parent)
dial = QDial()
self.spinbox = QSpinbox()

# --------------------------------------
# QT signal & QT slot
# --------------------------------------

# option 1: more efficient
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),
dial, SLOT("setValue(int)"))
# option 2:
self.connect(self.spinbox, SIGNAL("valueChanged(int)"),
dial.setValue)


# --------------------------------------
# QT signal & Python slot
# --------------------------------------

self.connect(self.spinbox, SIGNAL("valueChanged(int)"),
self.myValChanged)


# --------------------------------------
# Python signal & Qt slot
# --------------------------------------

# connect option 1: more efficient
self.connect(self, SIGNAL("mysignal"), dial,
SLOT("setValue(int)"))

# connect option 2:
self.connect(self, SIGNAL("mysignal"), dial.setValue)

# emit
param = 100
self.emit(SIGNAL("mysignal"), param)


# --------------------------------------
# Python signal & Python slot
# --------------------------------------

# connect
self.connect(self, SIGNAL("mysignal"), self.myValChanged)

# emit
param = 100
self.emit(SIGNAL("mysignal"), param)


def myValChanged(self):
print "New spin val entered {0}".format(self.spinbox.value())

结论是——

Python 信号的信号签名与 QT 信号的不同之处在于它没有括号,并且在您发出它时可以传递任何 python 数据类型。 Python 信号在您发出时创建。

对于slot,签名有3种形式。

  • s.connect(w, SIGNAL("signalSignature"), functionName)
  • s.connect(w,SIGNAL("signalSignature"), instance.methodName)
  • s.connect(w,SIGNAL("signalSignature"), instance, SLOT("slotSignature"))

1 号和 2 号可用于 Python 插槽,而 2 号和 3 号可用于 QT 插槽。很明显,除了 QT 预定义槽外,任何 python 可调用函数/方法都被限定为 Python 槽。

这些要点是在 Summerfield's article on Signals and Slots 中提出的.

[旧式 qt 信号槽] VS [新式 qt 信号槽]

好吧,上面的所有描述都是基于老式的 pyqt 信号和槽。正如@Idan K 所建议的那样,有一种替代的新样式可以做这些事情,尤其是对于 Python 信号。引用here了解更多。

关于python - PyQt4 信号和槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2048098/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com