问题说明
只在客户设备的工控机中,getOpenFileName()会严重卡顿,工控机系统为win11 。应用软件是Win11系统下开发的Qt程序,调用getOpenFileName函数,同一个程序在其他多台win11和win10系统笔记本或者台式机中,都可以正常运行,代码如下,程序打印“get open start”后,执行getOpenFileName()卡顿,未打印”get open end”.
解决过程
有网友说,是项目“保留堆栈大小”太小,因为默认的只有1M。将“保留堆栈大小”修改为1G后,依然卡顿;有网友说,和exe执行文件的名字有关系,修改exe执行文件名字后,依然卡顿;将上述代码单独创建一个最简单的工程,这个简单的工程中getOpenFileName()运行正常,但相同代码的应用程序卡顿。
解决办法
将getOpenFileName()的第6个参数设置为DontUseNativeDialog,应用程序中getOpenFileName()执行正常,不卡顿,问题解决。
备用调试代码
因为是过年前最后一天,时间比较紧,问题解决后,就没有用备用的调试代码,进行原因定位。该备用调试代码,是基于Qt中getOpenFileName()的源码整合过来形成的,后续有遇到相同问题的朋友,感兴趣的话,可以用下面代码调试定位。备用调试代码如下。
QString GetFileName::getOpenFileNameUser(QWidget *parent,const QString &caption,const QString &dir,
const QString &filter,QString *selectedFilter)
{
qDebug() << "getOpenFileNameUser start.";
QFileDialog dialog(parent, caption, dir, filter);
qDebug() << "getOpenFileNameUser set.";
QFileDialog::Options options;
dialog.setOptions(options);
QFileDialog::FileMode mode = QFileDialog::ExistingFiles;
dialog.setFileMode(mode);
dialog.setSupportedSchemes(QStringList(QStringLiteral("file")));
qDebug() << "getOpenFileNameUser filter file.";
if (selectedFilter && !selectedFilter->isEmpty())
dialog.selectNameFilter(*selectedFilter);
qDebug() << "getOpenFileNameUser exec dialog.";
if (dialog.exec() == QDialog::Accepted) {
if (selectedFilter)
*selectedFilter = dialog.selectedNameFilter();
qDebug() << "getOpenFileNameUser select urls.";
const QUrl selectedUrl = dialog.selectedUrls().value(0);
qDebug() << "getOpenFileNameUser get file name.";
QString file = "";
if (selectedUrl.isLocalFile() || selectedUrl.isEmpty())
file = selectedUrl.toLocalFile();
else
file = selectedUrl.toString();
if (!file.isNull()) {
qDebug() << "getOpenFileNameUser get file name ok.";
}
return file;
}
}