void MainWindow::on_actionAdd_File_triggered() { this->settings->beginGroup(QStringLiteral("paths")); QFileDialog *dialog = new QFileDialog(this); DialogMaster::masterDialog(dialog); dialog->setWindowTitle(tr("Open Icon Archive")); dialog->setAcceptMode(QFileDialog::AcceptOpen); dialog->setFileMode(QFileDialog::ExistingFiles); dialog->setDirectory(this->settings->value(QStringLiteral("openPath")).toString()); QStringList mTypes = byteToStringList(QImageReader::supportedMimeTypes()); mTypes.append(QStringLiteral("application/octet-stream")); dialog->setMimeTypeFilters(mTypes); QString selFilter = this->settings->value(QStringLiteral("openFilter")).toString(); qDebug() << selFilter; if(selFilter.isEmpty()) { #if defined(Q_OS_WIN) dialog->selectMimeTypeFilter(QStringLiteral("image/vnd.microsoft.icon")); #elif defined(Q_OS_OSX) dialog->selectMimeTypeFilter(QStringLiteral("image/x-icns")); #else dialog->selectMimeTypeFilter(QStringLiteral("image/png")); #endif } else dialog->selectNameFilter(selFilter); this->settings->endGroup(); dialog->open(this, SLOT(fileSelected(QStringList))); }
void ListEditor::exportData() { QFileDialog* dialog = new QFileDialog(this); dialog->setAttribute(Qt::WA_DeleteOnClose, true); dialog->setAcceptMode(QFileDialog::AcceptSave); dialog->open(); connect(dialog, SIGNAL(accepted()), this, SLOT(exportFileSelected())); }
void PresetManager::loadPresets() { checkAndSaveIfPresetModified(); QFileDialog *dialog = new QFileDialog(qobject_cast<QWidget*>(parent()), "Load Analyzing Presets", QGC::appDataDirectory(), "Analyzing Presets (*.ini);;All Files (*.*)"); dialog->setFileMode(QFileDialog::ExistingFile); dialog->open(this, SLOT(loadDialogAccepted())); }
void ParamCompareDialog::showLoadFileDialog() { ui->compareTableWidget->setRowCount(0); QDir parameterDir = QDir(QGC::parameterDirectory()); if(!parameterDir.exists()) parameterDir.mkdir(parameterDir.path()); QFileDialog *fileDialog = new QFileDialog(this,"Load",QGC::parameterDirectory()); QLOG_DEBUG() << "CREATED:" << fileDialog; fileDialog->setFileMode(QFileDialog::ExistingFile); fileDialog->setNameFilter("*.param *.txt"); fileDialog->open(this, SLOT(loadParameterFile())); connect(fileDialog,SIGNAL(rejected()),SLOT(dialogRejected())); }
/* 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 }