信号和槽通过平滑的扩展C++语法并充分利用C++的面向对象特性实现。信号和槽是类型安全的,可以重载,也可以重新实现,可以出现在类的公有区、保护区或私有区。若要使用信号和槽,必须继承 QObject 或其子类(比如QWidget类),并在类的定义中包括 Q_OBJECT 宏。信号在类的“信号区”声明,而槽则是在“公有槽区”、“保护槽区”或“私有槽区”中声明的。
对象间的信号与槽的关系如下图:
一个对象可以拥有0到多个信号和槽;一个信号可以连接多个槽,一个槽也可以连接多个信号;信号可以被动连接一个或多个槽(通过connect(Object1,signal1,Object2,slot2)),也可以主动发出信号(通过emit Singal(arguments)),不管有没有槽响应;一个信号不知道会有哪个或者会不会有槽来响应。
参数类型相同的信号和槽可以互相连接。槽的参数个数可以少于信号的参数个数,这时多余的参数将被忽略。
“信号与槽”学习补充:
(1) 一个信号可以与另外一个信号相连接,当发射第一个信号时,也会发射第二个信号;
(2) 连接可以被移除:disconnect(sender,SIGNAL,receive,SLOT);
(3) 要把信号成功连接到槽(或者连接到另外一个信号),它们的参数必须具有相同的顺序和相同的类型;如果信号的参数比它所连接的槽的参数多,那么多余的参数将会被简单地忽略掉。(这里的参数指的参数类型,不是参数名,也不能加参数名)。
重新认识和学习emit的用法
信号与槽的连接方式connect(this,&MainWindow::emitValue, table_view, &TableView::changeValue);
发射信号的方式 emit emitValue(haveSize);
有关信号与槽连接时出现问题及解决方法:
Object::connect: Nosuch signal QTreeWidget::itemClicked(QTreeWidgetItem*item,int column)…
原因:在信号和槽连接时,只需要加上参数的类型,不能加参数名。