QT :继承QFileDialog重新实现accept(),windows系统下无效

我继承了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);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值