信号究竟是由谁发出的?
当MainWindow1中的某个button点击触发了clicked事件,这个信号是由ui->button发出的
...
connect(ui->button, SIGNAL(clicked()), this, SLOT(example_slot()));
...
void MainWindow::example_slot() {
//do something
}
当同时存在两个窗口时:
观察动作:
MainWindow2中的button点击后触发槽函数向MainWindow1发送信号
button点击触发的信号是clicked,槽函数间接向MainWindow1发送信号:
...
connect(ui->button, SIGNAL(clicked()), this, SLOT(example_slot()));
...
void MainWindow::example_slot()
{
emit signal_example();
}
所以真正的sender是MainWindow2的实例,而不是MainWindow2的button
在MainWindow1中槽函数绑定应该这样写:
connect(&MainWindow2,SIGNAL(signal_example()),this,SLOT(example2_slot()));
总结:
直接信号源:
当MainWindow1中的某个按钮(例如ui->button)被点击时,该按钮直接发出了clicked()信号。这个信号是由按钮这个QWidget(继承自QObject)实例直接发出的。
使用connect(ui->button, SIGNAL(clicked()), this, SLOT(example_slot()));将按钮的clicked()信号连接到当前类(假设为MainWindow1)的example_slot()槽函数。
间接信号源:
在MainWindow2中,同样有一个按钮的点击触发了example_slot()槽函数。在这个槽函数内部,通过emit signal_example();发出了自定义信号signal_example()。
这个自定义信号signal_example()是由MainWindow2这个QObject派生的实例发出的,而不是由按钮直接发出。按钮仅仅是触发了这一过程。
信号的具体发出者:
信号总是由QObject派生的具体实例发出。无论信号是直接由控件(如按钮)发出,还是间接由包含这些控件的窗口类发出。
信号和槽的连接:
信号和槽的连接必须指明具体的信号发送者和信号接收者,这些都是QObject的实例。正确设置这些连接是确保信号能正确传达到预期接收者并触发相应槽函数的关键。