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); } }