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事件)