怎么理解QT中的信号与槽
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么理解QT中的信号与槽相关的知识,希望对你有一定的参考价值。
这个问题困扰我很久了。麻烦说的清楚点。我知道槽函数是对信号的响应,槽函数是自己定义的。但是我的问题是:信号也是自己定义的吗?而且为什么发射信号是在槽函数中了?class Foo : public QObject
Q_OBJECT
public:
Foo();
int value() const return val;
public slots:
void setValue( int );
signals:
void valueChanged( int );
private:
int val;
;
void Foo::setValue( int v )
if ( v != val )
val = v;
emit valueChanged(v);
而信号一般是只声明函数体,关键是其参数
信号一般是用来传参或者是一种逻辑的调用者
信号的发射可以在你自定义的函数中
就比如我们继承了一个widget,要重写mousePressEvent
于是我们就可以自己定义一个signal, MyClicked( const QPoint& pos )
然后在事件中emit( MyClicked( event->pos() ) )
不过一般clicked信号是在mouseReleaseEvent中emit的
当然这一切都必须你继承QObject以及声明Q_OBJECT了
而且你也可以把你自己的一些属性property声明至元系统
就是宏Q_PROPERTY(...)
这个其实很有用,举个例子
我们想知道信号发送者的某一个属性
于是我已经Connect了
然后我们就可以在对应的槽中获取
用sender()获取object对象然后调用property来获取发送者的某个属性
还是自己多运用吧
以上都我自己打的阿~ 你还有不会的可以hi我追问
我还是有一些地方不明白,(可能自己太笨了把)信号可以自己定义吗?我可以像调用普通函数那样调用信号吗?
本回答被提问者采纳PyQt5中的信号与槽,js 与 Qt 对象之间互相调用
信号(Signal)和槽(Slot)是Qt中的核心机制,用在对象之间互相通信。在Qt中每个QObject对象和PyQt中所有继承自QWidget的控件(这些都是QObject的子对象)都支持信号与槽机制。当信号发射时,连接的槽函数将会执行。在PyQt5中信号与槽通过object.signal.connect()方法连接。
Qt 提供了信号可以使用,当然你也可以QtCore.pySignal()来自定义信号
一个信号可以连接多个槽;
一个信号也可以连接另一个信号;
一个槽可以监听多个信号;
信号与槽的连接可能同步或者异步,还可能跨线程连接;
信号也可能断开。
connect(fun) 将槽函数地址传给connect 被信号连接
disconnect可以将接触信号与槽的连接;
使用mySignal.emit() 可以发射信号
如果需要自定义信号,可以使用PyQt5.QtCore下的pyqtSignal方法。
import sys,os
from PyQt5.QtCore import pyqtSignal,QObject
from PyQt5.QtWidgets import QMainWindow,QApplication
from PyQt5.QtGui import QIcon
path = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
class Communicate(QObject):
closeApp = pyqtSignal()
class MyWindow(QMainWindow):
def __init__(self):
super(MyWindow, self).__init__()
self.initUI()
def initUI(self):
self.setGeometry(600,300,500,400)
self.setWindowIcon(QIcon(r'%spicturechuan.ico' % path))
self.setWindowTitle('emit')
self.c = Communicate()
self.c.closeApp.connect(self.close)
def mousePressEvent(self, *args, **kwargs):
self.c.closeApp.emit()
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MyWindow()
win.show()
sys.exit(app.exec_())
在这个示例中,我们创建了一个closeApp的信号,该信号会在鼠标按下时触发。且该事件与QMainwindow绑定。
class Communicate(QObject):
closeApp = pyqtSignal()
这里,我们创建了一个Communicate类,并在该类下创建了信号。
self.c = Communicate()
self.c.closeApp.connect(self.close)
以上是关于怎么理解QT中的信号与槽的主要内容,如果未能解决你的问题,请参考以下文章