Qt之QFileDialog另存文件時(shí)應(yīng)該注意的問題
假設(shè)從主窗口中打開一個(gè)子窗口,在子窗口另存圖片,如下圖所示。
代碼一般是這樣的。
?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); }
這樣雖然可以正常保存圖片,但是存在一個(gè)奇怪的現(xiàn)象:直接點(diǎn)擊主窗口的標(biāo)題,無反應(yīng);如果在任務(wù)欄中點(diǎn)擊主窗口,主窗口卻可以切換到最前端,但是上面打按鈕和編輯框無法獲取焦點(diǎn)。
用過QQ或者微信等軟件,會(huì)發(fā)現(xiàn)他們在圖片另存時(shí),是可以正常繼續(xù)聊天的。
后來查了Qt助手,答案揭曉O(shè)n Windows the dialog will spin a blocking modal event loop that will not dispatch any QTimers。
因此要達(dá)到QQ或者微信的效果,就不能用getSaveFileName這個(gè)靜態(tài)方法。改良后的代碼如下。
QFileDialog?*m_fd;
m_fd?=?new?QFileDialog(this); connect(m_fd,?SIGNAL(accepted()),?this,?SLOT(slotAccepted()));
m_fd->setWindowTitle(QStringLiteral("ImageSaveAs"));//設(shè)置文件保存對話框的標(biāo)題 m_fd->setAcceptMode(QFileDialog::AcceptSave);//設(shè)置文件對話框?yàn)楸4婺J?m_fd->setOptions(QFileDialog::ShowDirsOnly?|?QFileDialog::DontResolveSymlinks);//只顯示文件夾 m_fd->setDirectory(":/image/good.png");//設(shè)置保存對話框的當(dāng)前文件夾 m_fd->selectFile(":/image/good.png");//設(shè)置默認(rèn)的文件名 QStringList?nameFilters; nameFilters?<<?"Images?(*.png?*.bmp?*.jpg??*.gif?*.jpeg)"; m_fd->setNameFilters(nameFilters);//設(shè)置文件類型過濾器 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); ????} }