今天解决的问题是使用线程调用相机进行操作,将操作中获取的数据进行在mainwindow中显示。困扰我来好几天了,呜呜呜,在学长的帮助下终于实现了。
主要方法是利用信号槽实现保存线程中的数据,并显示。
记录一下实现过程。其中看了这篇文章之后对这个的理解根据深刻。见文章末尾。
在DetectThread.h文件中,声明信号
signals,void uploadLineParamsSig(int,float,float);
参数:int : 表示直线的序号
float:表示直线的k
float:表示直线的b
然后在DetectThread.cpp文件进行发射信号
emit uploadLineParamsSig(i, info.first, info.second);
用mainwindow进行接收信号,所以就需要再mainwindow中声明槽函数。
首先在mainwindow.h文件声明槽函数和保存直线信息的vector
public slots:
void receiveLineInfo(int,float,float);
private:
//线的信息vector
std::vector<std::pair<float, float>> lineKBList;
最后需要在mainwindow.cpp文件中将槽函数进行实现,其主要功能是实现将线程中保存的直线信息显示在控件中。
void MainWindow::receiveLineInfo(int n, float k, float b) {
if (n >= lineKBList.size()) {
lineKBList.resize(n + 1);
}
lineKBList[n] = make_pair(k, b);
ui.textEdit->clear();
for (auto& kb : lineKBList) {
QString str1 = QString("%1").arg(kb.first, 0, 'g', 4);
QString str2 = QString("%1").arg(kb.second, 0, 'g', 6);
ui.textEdit->append("X = " + str1 + "*Y" + "+" + str2);
}
}
最后不要忘记将信号和槽进行连接:
connect(detectThread, &DetectThread::uploadLineParamsSig, this, &MainWindow::receiveLineInfo);