void Dialog::on_button_1_clicked() { QFileDialog d; //enum ViewMode { Detail, List }; d.setViewMode(QFileDialog::Detail); //enum FileMode { AnyFile, ExistingFile, Directory, ExistingFiles, DirectoryOnly }; d.setFileMode(QFileDialog::ExistingFiles); //enum AcceptMode { AcceptOpen, AcceptSave }; d.setAcceptDrops(QFileDialog::AcceptOpen); //enum Option { ShowDirsOnly, DontResolveSymlinks, DontConfirmOverwrite, DontUseSheet, DontUseNativeDialog, ReadOnly, HideNameFilterDetails } d.setOptions(QFileDialog::ReadOnly); d.exec(); std::stringstream s; if (d.result() == QDialog::Accepted) { s << "Number of files selected: " << d.selectedFiles().size() << '\n'; const auto v = d.selectedFiles(); for (auto f: v) s << f.toStdString() << '\n'; } else { assert(d.result() == QDialog::Rejected); s << "Dialog closed with cancel or close\n"; } ui->text_1->setPlainText(s.str().c_str()); }
void MainWindow::actionOpen() { QString filePath; QFileDialog* fileDialog = new QFileDialog(this, tr("Select File to open"), m_pathImport, tr("All Compatible (*.wzm *.pie *.obj);;" "WZM models (*.wzm);;" "PIE models (*.pie);;" "OBJ files (*.obj)")); fileDialog->setFileMode(QFileDialog::ExistingFile); fileDialog->exec(); if (fileDialog->result() == QDialog::Accepted) { filePath = fileDialog->selectedFiles().first(); // refresh import working dir m_pathImport = fileDialog->directory().absolutePath(); m_settings->setValue(WMIT_SETTINGS_IMPORTVAL, m_pathImport); PrependFileToRecentList(filePath); } delete fileDialog; fileDialog = nullptr; if (!filePath.isEmpty()) { openFile(filePath); // else popup on fail? } }
int main(int argc, char *argv[]) { QApplication a(argc, argv); QFileDialog d; //enum ViewMode { Detail, List }; d.setViewMode(QFileDialog::Detail); //enum FileMode { AnyFile, ExistingFile, Directory, ExistingFiles, DirectoryOnly }; d.setFileMode(QFileDialog::AnyFile); //enum AcceptMode { AcceptOpen, AcceptSave }; d.setAcceptDrops(QFileDialog::AcceptSave); //enum Option { ShowDirsOnly, DontResolveSymlinks, DontConfirmOverwrite, DontUseSheet, DontUseNativeDialog, ReadOnly, HideNameFilterDetails } //Without QFileDialog::DontUseNativeDialog there will not be an edit box to supply //a filename, under Lubuntu 13.04 (raring) d.setOptions(QFileDialog::DontUseNativeDialog); d.setWindowTitle("Save"); //Otherwise it states 'Open' d.exec(); if (d.result() == QDialog::Accepted) { std::cout << "Number of files selected: " << d.selectedFiles().size() << '\n'; const auto v = d.selectedFiles(); for (auto s: v) std::cout << s.toStdString() << '\n'; } else { assert(d.result() == QDialog::Rejected); std::cout << "Dialog closed with cancel or close\n"; } }
void MainWindow::actionAppendModel() { QString filePath; QFileDialog* fileDialog = new QFileDialog(this, tr("Select file to append"), m_pathImport, tr("All Compatible (*.wzm *.pie *.obj);;" "WZM models (*.wzm);;" "PIE models (*.pie);;" "OBJ files (*.obj)")); fileDialog->setFileMode(QFileDialog::ExistingFile); fileDialog->exec(); if (fileDialog->result() == QDialog::Accepted) { filePath = fileDialog->selectedFiles().first(); } delete fileDialog; fileDialog = nullptr; if (!filePath.isEmpty()) { ModelInfo newinfo; WZM newmodel; if (loadModel(filePath, newmodel, newinfo)) { for (int i = 0; i < newmodel.meshes(); ++i) { m_model.addMesh(newmodel.getMesh(i)); } doAfterModelWasLoaded(); } } }
void MainWindow::actionSaveAs() { ModelInfo tmpModelinfo(m_modelinfo); QStringList filters; filters << "PIE3 models (*.pie)" << "PIE2 models (*.pie)" << "WZM models (*.wzm)" << "OBJ files (*.obj)"; QList<wmit_filetype_t> types; types << WMIT_FT_PIE << WMIT_FT_PIE2 << WMIT_FT_WZM << WMIT_FT_OBJ; QFileDialog* fDialog = new QFileDialog(); fDialog->setFileMode(QFileDialog::AnyFile); fDialog->setAcceptMode(QFileDialog::AcceptSave); fDialog->setNameFilters(filters); fDialog->setWindowTitle(tr("Choose output file")); fDialog->setDirectory(m_pathExport); fDialog->exec(); if (fDialog->result() != QDialog::Accepted) { return; } if (!filters.contains(fDialog->selectedNameFilter())) { return; } tmpModelinfo.m_save_type = types[filters.indexOf(fDialog->selectedNameFilter())]; // refresh export working dir m_pathExport = fDialog->directory().absolutePath(); m_settings->setValue(WMIT_SETTINGS_EXPORTVAL, m_pathExport); QFileInfo finfo(fDialog->selectedFiles().first()); tmpModelinfo.m_saveAsFile = finfo.filePath(); QPointer<ExportDialog> dlg; switch (tmpModelinfo.m_save_type) { case WMIT_FT_PIE: case WMIT_FT_PIE2: tmpModelinfo.defaultPieCapsIfNeeded(); dlg = new PieExportDialog(tmpModelinfo.m_pieCaps, this); if (dlg->exec() == QDialog::Accepted) { tmpModelinfo.m_pieCaps = static_cast<PieExportDialog*>(dlg.data())->getCaps(); } if (finfo.suffix().toLower() != "pie") tmpModelinfo.m_saveAsFile += ".pie"; break; case WMIT_FT_OBJ: if (finfo.suffix().toLower() != "obj") tmpModelinfo.m_saveAsFile += ".obj"; break; case WMIT_FT_WZM: if (finfo.suffix().toLower() != "wzm") tmpModelinfo.m_saveAsFile += ".wzm"; break; } if (dlg && dlg->result() != QDialog::Accepted) { return; } m_modelinfo = tmpModelinfo; PrependFileToRecentList(m_modelinfo.m_saveAsFile); saveModel(m_model, m_modelinfo); }
/* static */ QStringList QIFileDialog::getOpenFileNames (const QString &aStartWith, const QString &aFilters, QWidget *aParent, const QString &aCaption, QString *aSelectedFilter /* = 0 */, bool aResolveSymlinks /* = true */, bool aSingleFile /* = false */) { /* It seems, running QFileDialog in separate thread is NOT needed under windows any more: */ #if defined (VBOX_WS_WIN) && (QT_VERSION < 0x040403) /** * QEvent class reimplementation to carry Win32 API native dialog's * result folder information */ class GetOpenFileNameEvent : public OpenNativeDialogEvent { public: enum { TypeId = QEvent::User + 3 }; GetOpenFileNameEvent (const QString &aResult) : OpenNativeDialogEvent (aResult, (QEvent::Type) TypeId) {} }; /** * QThread class reimplementation to open Win32 API native file dialog */ class Thread : public QThread { public: Thread (QWidget *aParent, QObject *aTarget, const QString &aStartWith, const QString &aFilters, const QString &aCaption) : mParent (aParent), mTarget (aTarget), mStartWith (aStartWith), mFilters (aFilters), mCaption (aCaption) {} virtual void run() { QString result; QString workDir; QString initSel; QFileInfo fi (mStartWith); if (fi.isDir()) workDir = mStartWith; else { workDir = fi.absolutePath(); initSel = fi.fileName(); } workDir = QDir::toNativeSeparators (workDir); if (!workDir.endsWith ("\\")) workDir += "\\"; QString title = mCaption.isNull() ? tr ("Select a file") : mCaption; QWidget *topParent = windowManager().realParentWindow(mParent ? mParent : windowManager().mainWindowShown()); QString winFilters = winFilter (mFilters); AssertCompile (sizeof (TCHAR) == sizeof (QChar)); TCHAR buf [1024]; if (initSel.length() > 0 && initSel.length() < sizeof (buf)) memcpy (buf, initSel.isNull() ? 0 : initSel.utf16(), (initSel.length() + 1) * sizeof (TCHAR)); else buf [0] = 0; OPENFILENAME ofn; memset (&ofn, 0, sizeof (OPENFILENAME)); ofn.lStructSize = sizeof (OPENFILENAME); ofn.hwndOwner = topParent ? topParent->winId() : 0; ofn.lpstrFilter = (TCHAR *)(winFilters.isNull() ? 0 : winFilters.utf16()); ofn.lpstrFile = buf; ofn.nMaxFile = sizeof (buf) - 1; ofn.lpstrInitialDir = (TCHAR *)(workDir.isNull() ? 0 : workDir.utf16()); ofn.lpstrTitle = (TCHAR *)(title.isNull() ? 0 : title.utf16()); ofn.Flags = (OFN_NOCHANGEDIR | OFN_HIDEREADONLY | OFN_EXPLORER | OFN_ENABLEHOOK | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST); ofn.lpfnHook = OFNHookProc; if (GetOpenFileName (&ofn)) { result = QString::fromUtf16 ((ushort *) ofn.lpstrFile); } // qt_win_eatMouseMove(); MSG msg = {0, 0, 0, 0, 0, 0, 0}; while (PeekMessage (&msg, 0, WM_MOUSEMOVE, WM_MOUSEMOVE, PM_REMOVE)); if (msg.message == WM_MOUSEMOVE) PostMessage (msg.hwnd, msg.message, 0, msg.lParam); result = result.isEmpty() ? result : QFileInfo (result).absoluteFilePath(); QApplication::postEvent (mTarget, new GetOpenFileNameEvent (result)); } private: QWidget *mParent; QObject *mTarget; QString mStartWith; QString mFilters; QString mCaption; }; if (aSelectedFilter) *aSelectedFilter = QString::null; /* Local event loop to run while waiting for the result from another * thread */ QEventLoop loop; QString startWith = QDir::toNativeSeparators (aStartWith); LoopObject loopObject ((QEvent::Type) GetOpenFileNameEvent::TypeId, loop); if (aParent) aParent->setWindowModality (Qt::WindowModal); Thread openDirThread (aParent, &loopObject, startWith, aFilters, aCaption); openDirThread.start(); loop.exec(); openDirThread.wait(); if (aParent) aParent->setWindowModality (Qt::NonModal); return QStringList() << loopObject.result(); #elif defined (VBOX_WS_X11) && (QT_VERSION < 0x040400) /* Here is workaround for Qt4.3 bug with QFileDialog which crushes when * gets initial path as hidden directory if no hidden files are shown. * See http://trolltech.com/developer/task-tracker/index_html?method=entry&id=193483 * for details */ QFileDialog dlg (aParent); dlg.setWindowTitle (aCaption); dlg.setDirectory (aStartWith); dlg.setFilter (aFilters); if (aSingleFile) dlg.setFileMode (QFileDialog::ExistingFile); else dlg.setFileMode (QFileDialog::ExistingFiles); if (aSelectedFilter) dlg.selectFilter (*aSelectedFilter); dlg.setResolveSymlinks (aResolveSymlinks); QAction *hidden = dlg.findChild <QAction*> ("qt_show_hidden_action"); if (hidden) { hidden->trigger(); hidden->setVisible (false); } return dlg.exec() == QDialog::Accepted ? dlg.selectedFiles() : QStringList() << QString::null; #elif defined (VBOX_WS_MAC) && (QT_VERSION >= 0x040600) && (QT_VERSION < 0x050000) /* After 4.5 exec ignores the Qt::Sheet flag. * See "New Ways of Using Dialogs" in http://doc.trolltech.com/qq/QtQuarterly30.pdf why. * We want the old behavior for file-save dialog. Unfortunately there is a bug in Qt 4.5.x * which result in showing the native & the Qt dialog at the same time. */ QFileDialog dlg(aParent); dlg.setWindowTitle(aCaption); /* Some predictive algorithm which seems missed in native code. */ QDir dir(aStartWith); while (!dir.isRoot() && !dir.exists()) dir = QDir(QFileInfo(dir.absolutePath()).absolutePath()); const QString strDirectory = dir.absolutePath(); if (!strDirectory.isNull()) dlg.setDirectory(strDirectory); if (strDirectory != aStartWith) dlg.selectFile(QFileInfo(aStartWith).absoluteFilePath()); dlg.setNameFilter(aFilters); if (aSingleFile) dlg.setFileMode(QFileDialog::ExistingFile); else dlg.setFileMode(QFileDialog::ExistingFiles); if (aSelectedFilter) dlg.selectFilter(*aSelectedFilter); dlg.setResolveSymlinks(aResolveSymlinks); QEventLoop eventLoop; QObject::connect(&dlg, SIGNAL(finished(int)), &eventLoop, SLOT(quit())); dlg.open(); eventLoop.exec(); return dlg.result() == QDialog::Accepted ? dlg.selectedFiles() : QStringList() << QString(); #else QFileDialog::Options o; if (!aResolveSymlinks) o |= QFileDialog::DontResolveSymlinks; # if defined (VBOX_WS_X11) /** @todo see http://bugs.kde.org/show_bug.cgi?id=210904, make it conditional * when this bug is fixed (xtracker 5167) * Apparently not necessary anymore (xtracker 5748)! */ // if (vboxGlobal().isKWinManaged()) // o |= QFileDialog::DontUseNativeDialog; # endif if (aSingleFile) return QStringList() << QFileDialog::getOpenFileName (aParent, aCaption, aStartWith, aFilters, aSelectedFilter, o); else return QFileDialog::getOpenFileNames (aParent, aCaption, aStartWith, aFilters, aSelectedFilter, o); #endif }
/** * Reimplementation of QFileDialog::getExistingDirectory() that removes some * oddities and limitations. * * On Win32, this function makes sure a native dialog is launched in * another thread to avoid dialog visualization errors occurring due to * multi-threaded COM apartment initialization on the main UI thread while * the appropriate native dialog function expects a single-threaded one. * * On all other platforms, this function is equivalent to * QFileDialog::getExistingDirectory(). */ QString QIFileDialog::getExistingDirectory (const QString &aDir, QWidget *aParent, const QString &aCaption, bool aDirOnly, bool aResolveSymlinks) { #if defined(VBOX_WS_WIN) && (QT_VERSION < 0x050000) /** * QEvent class reimplementation to carry Win32 API * native dialog's result folder information */ class GetExistDirectoryEvent : public OpenNativeDialogEvent { public: enum { TypeId = QEvent::User + 1 }; GetExistDirectoryEvent (const QString &aResult) : OpenNativeDialogEvent (aResult, (QEvent::Type) TypeId) {} }; /** * QThread class reimplementation to open Win32 API * native folder's dialog */ class Thread : public QThread { public: Thread (QWidget *aParent, QObject *aTarget, const QString &aDir, const QString &aCaption) : mParent (aParent), mTarget (aTarget), mDir (aDir), mCaption (aCaption) {} virtual void run() { QString result; QWidget *topParent = windowManager().realParentWindow(mParent ? mParent : windowManager().mainWindowShown()); QString title = mCaption.isNull() ? tr ("Select a directory") : mCaption; TCHAR path [MAX_PATH]; path [0] = 0; TCHAR initPath [MAX_PATH]; initPath [0] = 0; BROWSEINFO bi; bi.hwndOwner = topParent ? topParent->winId() : 0; bi.pidlRoot = 0; bi.lpszTitle = (TCHAR*)(title.isNull() ? 0 : title.utf16()); bi.pszDisplayName = initPath; bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT | BIF_NEWDIALOGSTYLE; bi.lpfn = winGetExistDirCallbackProc; bi.lParam = uintptr_t(&mDir); LPITEMIDLIST itemIdList = SHBrowseForFolder (&bi); if (itemIdList) { SHGetPathFromIDList (itemIdList, path); IMalloc *pMalloc; if (SHGetMalloc (&pMalloc) != NOERROR) result = QString::null; else { pMalloc->Free (itemIdList); pMalloc->Release(); result = QString::fromUtf16 ((ushort*)path); } } else result = QString::null; QApplication::postEvent (mTarget, new GetExistDirectoryEvent (result)); } private: QWidget *mParent; QObject *mTarget; QString mDir; QString mCaption; }; /* Local event loop to run while waiting for the result from another * thread */ QEventLoop loop; QString dir = QDir::toNativeSeparators (aDir); LoopObject loopObject ((QEvent::Type) GetExistDirectoryEvent::TypeId, loop); Thread openDirThread (aParent, &loopObject, dir, aCaption); openDirThread.start(); loop.exec(); openDirThread.wait(); return loopObject.result(); #elif defined (VBOX_WS_X11) && (QT_VERSION < 0x040400) /* Here is workaround for Qt4.3 bug with QFileDialog which crushes when * gets initial path as hidden directory if no hidden files are shown. * See http://trolltech.com/developer/task-tracker/index_html?method=entry&id=193483 * for details */ QFileDialog dlg (aParent); dlg.setWindowTitle (aCaption); dlg.setDirectory (aDir); dlg.setResolveSymlinks (aResolveSymlinks); dlg.setFileMode (aDirOnly ? QFileDialog::DirectoryOnly : QFileDialog::Directory); QAction *hidden = dlg.findChild <QAction*> ("qt_show_hidden_action"); if (hidden) { hidden->trigger(); hidden->setVisible (false); } return dlg.exec() ? dlg.selectedFiles() [0] : QString::null; #elif defined (VBOX_WS_MAC) && (QT_VERSION >= 0x040600) /* After 4.5 exec ignores the Qt::Sheet flag. * See "New Ways of Using Dialogs" in http://doc.trolltech.com/qq/QtQuarterly30.pdf why. * We want the old behavior for file-save dialog. Unfortunately there is a bug in Qt 4.5.x * which result in showing the native & the Qt dialog at the same time. */ QFileDialog dlg(aParent); dlg.setWindowTitle(aCaption); dlg.setDirectory(aDir); dlg.setResolveSymlinks(aResolveSymlinks); dlg.setFileMode(aDirOnly ? QFileDialog::DirectoryOnly : QFileDialog::Directory); QEventLoop eventLoop; QObject::connect(&dlg, SIGNAL(finished(int)), &eventLoop, SLOT(quit())); dlg.open(); eventLoop.exec(); return dlg.result() == QDialog::Accepted ? dlg.selectedFiles().value(0, QString()) : QString(); #else QFileDialog::Options o; # if defined (VBOX_WS_X11) /** @todo see http://bugs.kde.org/show_bug.cgi?id=210904, make it conditional * when this bug is fixed (xtracker 5167). * Apparently not necessary anymore (xtracker 5748)! */ // if (vboxGlobal().isKWinManaged()) // o |= QFileDialog::DontUseNativeDialog; # endif if (aDirOnly) o |= QFileDialog::ShowDirsOnly; if (!aResolveSymlinks) o |= QFileDialog::DontResolveSymlinks; return QFileDialog::getExistingDirectory (aParent, aCaption, aDir, o); #endif }