Qt之QFileDialog另存文件时应该注意的问题
扫描二维码
随时随地手机看文章
假设从主窗口中打开一个子窗口,在子窗口另存图片,如下图所示。
代码一般是这样的。
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);
}
}




