假設從主窗口中打開一個子窗口,在子窗口另存圖片,如下圖所示。
代碼一般是這樣的。
?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或者微信等軟件,會發(fā)現他們在圖片另存時,是可以正常繼續(xù)聊天的。
后來查了Qt助手,答案揭曉On Windows the dialog will spin a blocking modal event loop that will not dispatch any QTimers。
因此要達到QQ或者微信的效果,就不能用getSaveFileName這個靜態(tài)方法。改良后的代碼如下。
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); ????} }