Qt中getOpenFileName造成卡顿

问题说明

只在客户设备的工控机中,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;

}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值