我继承了QFileDialog,对虚函数accept()做了重新实现,在windows下实例化类后exec(),代码进入我accept方法后,文件对话框会消失。并且仍然阻塞了整个程序的运行。重新实现changeEvent()事件加打印,打印会出现。
void QFileDialog::setOption(QFileDialog::Option option, bool on = true)该方法可以通过设置QFileDialog::DontUseNativeDialog,即不使用系统自带的文件对话框。就不会有以上的问题了。
可是如果坚持使用系统自带文件对话框,该如何解决?(以下附上代码)
#ifndef CFILEDIALOG_H
#define CFILEDIALOG_H
/**
重写QFIleDialog,旨在解决 ubuntu系统下 ,
保存文件时,用户键盘输入文件名,点击保存后不会校验文件名是否重复,会忽略文件名重复的情况,导致文件覆盖,造成用户文件数据丢失。
通过设置suffix属性可以通用于所有文件后缀.
**/
#include <QFileDialog>
#include <QMessageBox>
class CfileDialog : public QFileDialog
{
Q_OBJECT
public:
CfileDialog(QWidget *parent = nullptr, const QString &caption = QString(), const QString &directory = QString(), const QString &filter = QString());
static QString CfileDialogGetSaveFileName(const QString &suffix,
QWidget *parent = nullptr,
const QString &caption = QString(),
const QString &dir = QString(),
const QString &filter = QString(),
QString *selectedFilter = nullptr,
Options options = Options());
public slots:
void accept() override;
public:
void setOnlySuffix(const QString & suffix)
{
m_suffix = suffix;
}
private:
QString m_suffix{""};
// QWidget interface
protected:
virtual void closeEvent(QCloseEvent *event) override;
// QWidget interface
public slots:
virtual void setVisible(bool visible) override;
protected:
virtual void changeEvent(QEvent *) override;
// QDialog interface
public slots:
virtual void done(int) override;
};
#endif // CFILEDIALOG_H
#include "cfiledialog.h"
#include <QWidget>
#include <QFileInfo>
#include <QDebug>
CfileDialog::CfileDialog(QWidget *parent, const QString &caption, const QString &directory, const QString &filter)
:QFileDialog(parent,caption,directory,filter)
{
}
QString CfileDialog::CfileDialogGetSaveFileName(const QString &suffix, QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, Options options)
{
Q_UNUSED(selectedFilter);
QString _result{""};
CfileDialog *_dialog = new CfileDialog(parent,caption,dir,filter);
// _dialog->setOptions(QFileDialog::DontUseNativeDialog);
_dialog->setOnlySuffix(suffix);
qInfo()<<"CfileDialog::CfileDialogGetSaveFileName 111111";
if(_dialog->exec())
{
if(!_dialog->selectedFiles().isEmpty())
{
_result = _dialog->selectedFiles().front();
}
}
qInfo()<<"CfileDialog::CfileDialogGetSaveFileName 222222";
delete _dialog;
//_dialog->deleteLater();
return _result;
}
void CfileDialog::accept()
{
if(!selectedFiles().empty())
{
QString _filename = selectedFiles().front();
QString _filenameSuffix = _filename+"."+m_suffix;
QFileInfo _fileiii(_filename);
if(_fileiii.suffix().isEmpty())
{
_filename = _filenameSuffix;
}
else{
if(_fileiii.suffix()!=m_suffix)
{
_filename = _filenameSuffix;
}
}
if(QFileInfo::exists(_filename))
{
QFileInfo _fileInfo(_filename);
int ret = QMessageBox::warning(this,"保存文件",_fileInfo.fileName()+" 已存在。\n要替换它吗?",QMessageBox::Yes | QMessageBox::No);
if(ret == QMessageBox::Yes)
{
QFileDialog::accept();
}
}
else{
QFileDialog::accept();
}
}
}
void CfileDialog::closeEvent(QCloseEvent *event)
{
qInfo()<<"CfileDialog::closeEvent";
QFileDialog::closeEvent(event);
}
void CfileDialog::setVisible(bool visible)
{
qInfo()<<"CfileDialog::setVisible "<<visible;
QFileDialog::setVisible(visible);
}
void CfileDialog::changeEvent(QEvent *event)
{
qInfo()<<"CfileDialog::changeEvent ";
QFileDialog::changeEvent(event);
}
void CfileDialog::done(int a)
{
qInfo()<<"CfileDialog::done"<<a;
QFileDialog::done(a);
}