最近用Qt界面程序用来处理序列图像的目标检测,每次输入一组序列图,检测结果(每一帧图像上目标的个数,对应坐标,置信度等)除了以图像形式实时显示意外,还需要以文本形式显示在界面上。
我采用了QTextEdit控件来显示文本。实现主要流程如下:
1,每一帧图像检测完成后,调用一个消息函数,消息函数的参数为要显示的QString;
2,收到消息后槽函数执行文本显示函数。
示例:
1.h:
Signals:
void sendMessage(QString msg);//信号函数只有声明,不需要写定义
1.cpp:
for(int i=0,i<resultCount;i++)
{
QString message=QString("第%1 个目标 x=%2 y=%3 width=%4 height=%5 置信度 =%6”).arg(i).arg(result[i].x).arg(result[i].y).arg(result[i].w).arg(result[i].h).arg(result[i].v);
sendMessage(message);//发送信号
}
2.h:
public slots:
void receiveMeaage(QString msg);//槽函数
2.cpp:
void MyClass::receiveMeaage(QString msg)
{
ui.myTextEdit->append(msg);//添加字符串作为一个段落到TextEdit控件中
}
以上完成了信号发送和字符串显示到控件上的部分,完事具备,只欠东风,将信号函数和槽函数连接起来就好了。
QObject::connect(this,SIGNAL(sendMessage(QString)),this,SLOT(recieveMessage(QString)));//这里的QString就是QString(有点绕,就是说这里写类型名而非变量名)
至此就实现将程序运行中间结果实时传输到界面上显示了。
再说两个小点:
1,arg()函数是QString的公有函数,可以很方便地替代字符串中的变量,用%1,%2,%3.....表示字符串中的变量(比如每帧图像的中间结果),arg()是重载函数,还可以控制被替换变量的格式,功能比较实用。
2,其实也可以不用信号和槽的形式,直接将槽函数的内容加到发送信号函数的位置,但这样不免失去了Qt的一个重要意义,在很多地方都需要用到这样的功能的时候,一个信号函数就显得简单方便多了。