Qt之QFileDialog另存文件时应该注意的问题

假设从主窗口中打开一个子窗口,在子窗口另存图片,如下图所示。

Qt之QFileDialog另存文件时应该注意的问题_第1张图片

代码一般是这样的。

 QString dirPath = QFileDialog::getSaveFileName(NULL, QStringLiteral("ImageSaveAs"), ":/image/good.png", QString(tr("Images (*.png *.bmp *.jpg  *.gif *.jpeg)")),
                                                   Q_NULLPTR, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);

//如果选择的路径无效,则不保存
if (!dirPath.isEmpty())
{
    QFileInfo fileInfo(dirPath);
    if (fileInfo.exists())
        QFile::remove(dirPath);
    QFile::copy(":/image/good.png", dirPath);
}
这样虽然可以正常保存图片,但是存在一个奇怪的现象:直接点击主窗口的标题,无反应;如果在任务栏中点击主窗口,主窗口却可以切换到最前端,但是上面打按钮和编辑框无法获取焦点。

用过QQ或者微信等软件,会发现他们在图片另存时,是可以正常继续聊天的。

后来查了Qt助手,答案揭晓On Windows the dialog will spin a blocking modal event loop that will not dispatch any QTimers

因此要达到QQ或者微信的效果,就不能用getSaveFileName这个静态方法。改良后的代码如下。

QFileDialog *m_fd;
m_fd = new QFileDialog(this);
connect(m_fd, SIGNAL(accepted()), this, SLOT(slotAccepted()));
m_fd->setWindowTitle(QStringLiteral("ImageSaveAs"));//设置文件保存对话框的标题
m_fd->setAcceptMode(QFileDialog::AcceptSave);//设置文件对话框为保存模式
m_fd->setOptions(QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);//只显示文件夹

m_fd->setDirectory(":/image/good.png");//设置保存对话框的当前文件夹
m_fd->selectFile(":/image/good.png");//设置默认的文件名
QStringList nameFilters;
nameFilters << "Images (*.png *.bmp *.jpg  *.gif *.jpeg)";
m_fd->setNameFilters(nameFilters);//设置文件类型过滤器
m_fd->open();
void SaveAsDialog::slotAccepted()
{
    QString dirPath = "";
    dirPath = m_fd->selectedFiles()[0];
    //如果选择的路径无效,则不保存
    if (!dirPath.isEmpty())
    {
        QFileInfo fileInfo(dirPath);
        if (fileInfo.exists())
            QFile::remove(dirPath);
        QFile::copy(":/image/good.png", dirPath);
    }
}






你可能感兴趣的:(Qt)