我正在编写一个简单的Qt应用程序来测试多线程(我也是新手)。我制作了一个QApplication来管理GUI,然后我编写了一个包含类MainWindow的类VisionApp,它是一个子类QMainWindow。
在MainWindow类中,我编写了一个函数void MainWindow :: getfromfilevd(),它使用这个连接到按钮:
QObject::connect(ui->FileVdButton,SIGNAL(clicked()),this,SLOT(getfromfilevd()));
然后我想通过使用QFileDialog :: getOpenFileName从文件中读取图像,我的代码在这里:
void MainWindow::getfromfilevd()
{
//mutex.lock();
from_imgorvd = true;
QString fileName = QFileDialog::getOpenFileName(this, tr("Open Image"),"", tr("Image Files (*.png *.jpg *.bmp *.xpm)"));
if(fileName.isEmpty()) {
cv::Mat image;
image = cv::imread(fileName.toUtf8().constData(), CV_LOAD_IMAGE_COLOR);
mutex.lock();
Mat_Img = image.clone();
mutex.unlock();
}
}
但是,每次单击该按钮时,QFileDialog的窗口都会打开,但它是空白的,然后我的程序意外完成。
当我使用此代码时:
void MainWindow::getfromfilevd()
{
from_imgorvd = true;
cv::Mat image;
image = cv::imread("/home/somnus/Picture/mouse.jpg", CV_LOAD_IMAGE_COLOR);
if(! image.data) {
std::cout << "Could not open or find the image" << std::endl ;
}
else {
mutex.lock();
Mat_Img = image.clone();
mutex.unlock();
}
}
效果很好。
我真的很奇怪我犯了哪个错误...... 希望得到你的帮助
答案 0 :(得分:2)
它应该是这样的,!fileName.isEmpty()
而不是fileName.isEmpty()
因为你需要在文件名不为空时加载图像而不是相反。