QMetaObject::connectSlotsByName

QMetaObject::connectSlotsByName

[static] void QMetaObject::connectSlotsByName(QObject *object)

Searches recursively for all child objects of the given object, and connects matching signals from them to slots of object that follow the following form:

 
  void on_<object name>_<signal name>(<signal parameters>);
 

Let's assume our object has a child object of type QPushButton with the object name button1. The slot to catch the button's clicked() signal would be:

 
  void on_button1_clicked();
 

If object itself has a properly set object name, its own signals are also connected to its respective slots.

See also QObject::setObjectName().

---------------------------

注意:

        connectSlotsByName 只会为以on_开头的槽去自动寻找一个对应的信号,如果不满足匹配条件,均会提示无法为槽寻找到正确的信号,对于非on_开头的槽,不会进行自动处理;大家需要知道的是,提示无法为槽寻找到正确信号,这并不代表你的代码有错误,只表示你定义了一个以on_开头的槽,但它的命名无法让系统为它自动匹配信号。你需要做的是,对于自定义并进行手动连接的槽,不要以on_开头即可。

说明:

  1. 尽量不要让QObject出现相同objectName的情况
  2. 如果同名connectSlotsByName只能给其中一个建立缺省的信号和槽的连接
  3. 如果出现大量编码创建大量控件的情况,最好是自己去建立信号和槽的连接,而不是依赖connectSlotsByName来做到这个工作。connectSlotsByName更适合的任务是与desinger配合完成缺省的信号和槽的连接。

其他:

在测试过程中,曾经把ui->setupUi(this);放到了控件创建之前运行,结果运行时提示:

QMetaObject::connectSlotsByName: No matching signal for on_TestButton_clicked

从connectSlotsByName的代码可以看到这实际上执行的是第46行,如果在调试程序中遇到这样的信息,可以检查一下,是否是控件的objectName与你编写的槽里的objectName并不相符。

============== End

猜你喜欢

转载自www.cnblogs.com/lsgxeva/p/12163145.html
今日推荐