前言
接上文,手动绘制的矩形框毕竟还是在上位机的播放界面内,想要把数据发送给3559还是需要通过串口或者网口发送,没有部署在一个界面就需要不同UI间数据和信号进行交互了,数据还好说,全局变量都可以做到,信号的话使用connect将信号和槽连接起来就可以了,对于槽函数和信号发起者和槽的接收者一定要注意匹配
同一个界面的信号和槽
在Qt中,信号和槽是一种非常重要的机制,用于实现对象间的通信和交互。信号是对象发出的事件,槽是响应这些事件的函数。一个对象可以通过emit关键字发出一个信号,其他对象可以将自己的槽函数与这个信号连接起来,当信号被发出时,所有与之连接的槽函数都会被调用。
在同一个界面中,可以通过对象之间的信号和槽连接来实现界面控件之间的交互。具体步骤如下:
1. 在界面设计时,为需要接收信号的控件设置一个名称,方便后续使用。
2. 在界面对应的类中,定义槽函数,在槽函数中实现对控件的操作。
3. 在类的构造函数中,将控件的信号与槽函数连接起来。使用QObject::connect函数实现连接,其语法如下:
connect(sender, signal, receiver, slot);
其中,sender是发出信号的对象,signal是信号名称,receiver是接收信号的对象,slot是槽函数名称。
例如,如果想将一个按钮的clicked()信号和一个自定义的槽函数相连接,可以用下面的代码:
connect(ui->button, &QPushButton::clicked, this, &MyClass::mySlot);
在点击按钮时,emit clicked()信号,就会调用mySlot()函数。
4. 在槽函数的实现中,注意可以通过sender()函数获取发出信号的对象指针,进而对该对象进行操作。
总之,通过信号和槽的连接,可以实现同一个界面中不同控件之间的交互和协作,提高界面的交互性和可用性。
比如想要实现在播放界面框选目标,3559实现跟踪功能
就需要在播放区域绘制矩形框后发送信号给button,button作为槽再解决发送的问题,我觉得可以理解为中断处理函数,微观上讲,发出了信号就好比产生了中断,连接信号槽之后就好比跳转到了中断处理函数,解决完再次返回,宏观上同时进行
先在头文件中申明信号
signals:void buttonClicked_ctrl_left();//通知串口网口void buttonClicked_shift_left();//通知串口网口void buttonClicked_exit_left();//通知串口网口
写出对应的槽函数,注意此时的槽函数是执行发送了另一个信号
void rtsp::on_pushButton_clicked()
{emit buttonClicked_ctrl_left1();
}void rtsp::on_pushButton_2_clicked()
{emit buttonClicked_shift_left1();
}void rtsp::on_pushButton_3_clicked()
{emit buttonClicked_exit_left1();
}
在构造函数内将信号和槽连接,播放部分的类是FFmpegWidget,在界面中命名为playWidget,一定一定要匹配信号的发起者和槽的接收者
connect(ui_rtsp->playWidget, &FFmpegWidget::buttonClicked_ctrl_left, this, &rtsp::on_pushButton_clicked);
connect(ui_rtsp->playWidget, &FFmpegWidget::buttonClicked_shift_left, this, &rtsp::on_pushButton_2_clicked);
connect(ui_rtsp->playWidget, &FFmpegWidget::buttonClicked_exit_left, this, &rtsp::on_pushButton_3_clicked);
不同界面的信号和槽
不同界面之间的连接也可用通过类似方式,但是slots需要声明为public
申明信号
signals:void buttonClicked_ctrl_left1();//通知串口网口void buttonClicked_shift_left1();//通知串口网口void buttonClicked_exit_left1();//通知串口网口
申明槽函数
public slots:void on_pushButton_3_clicked();void on_pushButton_31_clicked();void on_pushButton_clicked();
main函数中将二者连接
rtsp w;serial w2;QObject::connect(&w, &rtsp::buttonClicked_ctrl_left1, &w2, &serial::on_pushButton_3_clicked);QObject::connect(&w, &rtsp::buttonClicked_shift_left1, &w2, &serial::on_pushButton_31_clicked);QObject::connect(&w, &rtsp::buttonClicked_exit_left1, &w2, &serial::on_pushButton_clicked);
槽函数内将传来的坐标换算发送即可
测试发现绘制的矩形框和跟踪结果完全一致,非常成功