QT 信号和槽
信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性。要正确的处理信号和槽,必须借助一个称为 moc(Meta Object Compiler)的 QT 工具,该工具是一个 C++ 预处理程序,它为高层次的事件处理自动生成所需要的附加代码。 信号和槽能携带任意数量和任意类型的参数。我们可以将很多信号与单个的槽进行连接,也可以将单个的信号与很多的槽进行连接,(当这个信号被发射时,这些槽将会一个接一个地 执行,但是它们执行的顺序将会是随机的、不确定的,我们不能人为地指定哪个先执行、哪个后执行。)甚至于将一个信号与另外一个信号相连接,这时无论第一个信号什么时候发射系统都将立刻发射第二个信号。总之,信号与槽构造了一个强大的部件编程机制。
信号(Signals)
信号只需要在头文件中做声明,不需要在cpp中实现。放在QT自定义关键字signals下,在此之前一定要加上Q_OBJECT宏!
在编程中,一般使用的是控件内部定义好的信号。如:QTreeWidget类下的 Signals:
1 2 3 4 5 6 7 8 9 10 | void currentItemChanged ( QTreeWidgetItem * current, QTreeWidgetItem * previous ) void itemActivated ( QTreeWidgetItem * item, int column ) void itemChanged ( QTreeWidgetItem * item, int column ) void itemClicked ( QTreeWidgetItem * item, int column ) void itemCollapsed ( QTreeWidgetItem * item ) void itemDoubleClicked ( QTreeWidgetItem * item, int column ) void itemEntered ( QTreeWidgetItem * item, int column ) void itemExpanded ( QTreeWidgetItem * item ) void itemPressed ( QTreeWidgetItem * item, int column ) void itemSelectionChanged () |
也可以自定义信号,并通过emit在代码中发射信号。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // ------------ sender.h ----------- class sender : public QObject { Q_OBJECT public : void doSend(); signals: void send( int ); }; // ------------ sender.cpp ----------- #include "sender.h" void sender :: doSend() { emit send(40); } |
槽(Slots)
槽和普通的C++成员函数几乎是一样的(可以是虚函数,可以被重载,可以是public slots、protected slots、private slots,可以被其他C++成员函数直接调用;唯一不同的是:槽还可以和信号连接在一起,在这种情况下,信号被发射时,会自动调用这个槽。)槽不需要信号传过来的参数时,可以不要参数;但槽一旦要参数,其参数个数,类型,顺序必须要和对应的信号保持一致。另外,槽的参数不能有缺省值。
1 2 3 4 5 6 7 8 9 10 11 12 13 | // ------------ receiver.h ----------- class receiver : public QObject { Q_OBJECT public slots: void recv( int ); }; // ------------ Receiver.cpp ----------- void receiver :: recv( int n) { qDebug()<< "recv number: " <<n<<endl; } |
++++ ++++
关联信号和槽(connect)
可以使用QObject类的静态成员函数connect来建立信号的槽的关联
bool QObject::connect ( const QObject * sender, const char * signal , const QObject * receiver, const char * slot) [ static ] |
具体的调用为:connect(sender, SIGNAL(signal), receiver, SLOT(slot)); 其中sender和receiver为QObject类对象的指针; SIGNAL宏和SLOT宏将信号的槽转换成字符串。
1 2 3 | sender s; receiver r; QObject::connect(&s, SIGNAL(send( int )), &r, SLOT(recv( int ))); |
注:在connect函数中信号函数和槽函数若有参数,只能写出参数类型,而不能也将变量名写出;否则,连接会失败!
断开信号和槽(disconnect)
当信号和槽没有必要继续保持连接时,可以通过调用disconnect来断开它们。
bool QObject::disconnect ( const QObject * sender, const char * signal , const Object * receiver, const char * slot) [ static ] |
有三种情况必须使用 disconnect() 函数:
(1)断开与某个对象相关联的任何对象。
disconnect(sender, 0, 0, 0) ; //或者 sender->disconnect(); |
(2)断开与某个特定信号的任何关联。
disconnect(sender, SIGNAL( signal ()), 0, 0); //或者 sender->disconnect(SIGNAL( signal ())); |
(3)断开两个对象之间的关联。
disconnect(sender, 0, receiver, 0); //或者 sender->disconnect(receiver); |
更多的请参考:http://www.ibm.com/developerworks/cn/linux/guitoolkit/qt/signal-slot/index.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)