QFileDialog::getOpenFileNames 弹框时不能拖拽文件到窗口(不响应dragEnterEvent 事件)

1、QFileDialog 5.6升级到5.9后出现的一个BUG

Qt5.6 升级到5.9后, 在 QGuiApplicationPrivate::processDrag中, 判断了窗口如果是模态就忽略drap事件,针对于这个BUG解决方案如下

1、不再使用QFileDialog的静态事件,QT自动创建的QFileDialog是模态对话框
2、使用setWindowFlags 设计窗口非模态FramelessWindowHint
3、设置过滤器等信息, 再调用exec,注意此时的QFileDialog 仍然是模态,但是由于QGuiApplication 已经开启事件循环,并不再忽略drap事件
 

class HiFileDialog : public QFileDialog
{
	Q_OBJECT
public:
	HiFileDialog(QWidget *parent, Qt::WindowFlags f);
	explicit HiFileDialog(QWidget *parent = Q_NULLPTR,
		const QString &caption = QString(),
		const QString &directory = QString(),
		const QString &filter = QString());

	~HiFileDialog();
};
#include "HiFileDialog.h"

HiFileDialog::HiFileDialog(QWidget *parent, Qt::WindowFlags f)
	: QFileDialog(parent, f)
{
	setWindowFlags(Qt::FramelessWindowHint);
	setAcceptMode(QFileDialog::AcceptOpen);//文件对话框为打开类型
	setViewMode(QFileDialog::Detail);//详细
	setFileMode(QFileDialog::ExistingFiles);//多文件
	setWindowTitle("选择文件");
}

HiFileDialog::HiFileDialog(QWidget *parent /*= Q_NULLPTR*/, const QString &caption /*= QString()*/, const QString &directory /*= QString()*/, const QString &filter /*= QString()*/)
	: QFileDialog(parent, caption, directory, filter)
{
	setWindowFlags(Qt::FramelessWindowHint);
	setAcceptMode(QFileDialog::AcceptOpen);//文件对话框为打开类型
	setViewMode(QFileDialog::Detail);//详细
	setFileMode(QFileDialog::ExistingFiles);//多文件
	setWindowTitle("选择文件");
}

HiFileDialog::~HiFileDialog()
{
}

注意:使用时候,需要再调用exec 此时窗口仍然是模态,但是能响应dragEnterEvent 事件(可以算作QT的BUG吧,准确做法是QT开发接口,是否接受Drag事件)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值