crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Проблемы с функцией QFileDialog::getOpenFileName
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
AD Дата 7.10.2009, 8:23
  Вот реализация "оберток":
/// Вызов окна диалога для выбора открываемого файла
QString getOpenFileName(QWidget* parent, const char* caption, const char* directory, const char* filter)
{
    const int NAME_SIZE = 550;
    char fname[NAME_SIZE] = {0};        ///< буфер для имени файла
    bool result = false;

#ifdef Q_WS_WIN
    OPENFILENAME ofn;                    ///< структура диалога открытия файла
    ::ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = 88;
    ofn.hwndOwner = (parent) ? parent -> winId() : 0;
    ofn.lpstrFile = fname;
    ofn.nMaxFile = sizeof(fname);
    ofn.lpstrFilter = filter;
    ofn.nFilterIndex = 0;
    ofn.lpstrFileTitle = 0;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = directory;
    ofn.lpstrTitle = caption;
    ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

    if(::GetOpenFileName(&ofn) == 1) result = true;
#endif // Q_WS_WIN

    return (result) ? QString(fname) : QString("");
}

/// Вызов окна диалога для выбора открываемых файлов
QStringList getOpenFileNames(QWidget* parent, const char* caption, const char* directory, const char* filter)
{
    const int NAME_SIZE = 5500;
    char fname[NAME_SIZE] = {0};        ///< буфер для имени файла
    QStringList list;

#ifdef Q_WS_WIN
    OPENFILENAME ofn;                    ///< структура диалога открытия файла
    ::ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = 88;
    ofn.hwndOwner = (parent) ? parent -> winId() : 0;
    ofn.lpstrFile = fname;
    ofn.nMaxFile = sizeof(fname);
    ofn.lpstrFilter = filter;
    ofn.nFilterIndex = 0;
    ofn.lpstrFileTitle = 0;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = directory;
    ofn.lpstrTitle = caption;
    ofn.Flags = OFN_ALLOWMULTISELECT | OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

    if(::GetOpenFileName(&ofn) == 1)
    {
        if(ofn.nFileExtension)
            list << QString(fname);
        else if(ofn.nFileOffset)
        {
            QString path(QString(fname) + QDir::separator()), name("");
            for(int i=ofn.nFileOffset, j=ofn.nFileOffset+1; fname[i]!=0 || fname[j]!=0 || j<sizeof(fname); ++i,
                ++j)
            {
                if(fname[i] != 0)
                    name += QChar(fname[i]);
                if(fname[j] == 0)
                    list << QString(path + name),
                    name.clear(),
                    ++i, ++j;
                if(fname[i] == 0 && fname[j] == 0)
                    break;
            }
        }
    }
#endif // Q_WS_WIN

    return list;
}
AD Дата 6.10.2009, 17:44
  Ура! :) Стандартная функция Windows GetOpenFileName работает отлично! :)

P.S. Выходит, что-то у троллей с QFileDialog не так! Надо будет отчет об ошибке отправить.
Юра, ты ведь уже подобные вещи отправлял! Сможешь отправить баг-репорт? Ну смысл ошибки ты уже знаешь по этой теме!
AD Дата 6.10.2009, 17:10
  Понимаю, что неидеальное решение, но попробовать стоит! Попробую через Windows функцию GetOpenFileName реализовать диалог открытия. Если повезет, то такой вариант и оставлю. Если вдруг буду переносить код, то реализую подобные функции-обертки для Linux, Unix, MacOS! :)
kwisp Дата 6.10.2009, 16:30
  Я бегло просмотрел асситент. не обнаружил.
если и ты не найдешь по форумам и в ассистенте, то могу предложить стопнуть сеть через внешний процесс. :)
с помощью объекта класса QProcess()


П.С.
вот такие костыли :)
AD Дата 6.10.2009, 13:53
  Тут возник вопрос такой! :) есть ли возможность программно отключать сеть на время работы этого диалога? Т.е. есть ли возможности включения/выключения сети ПРОГРАММНО?
AD Дата 6.10.2009, 10:30
  Полез в исходники QFileDialog
Некоторое, непродолжительное время (от 3 до 5 секунд (несмертельно, эти задержки незаметны в релизном режиме)) зависает при создании диалогового окна на функции init, а в ней на функции - restoreState
QFileDialog::QFileDialog(QWidget *parent,
                     const QString &caption,
                     const QString &directory,
                     const QString &filter)
    : QDialog(*new QFileDialogPrivate, parent, 0)
{
    Q_D(QFileDialog);
    d->init(directory, filter, caption);
}

Ну а далее основательно зависает на функции exec(), а в ней на строчках:
int QDialog::exec()
{
// ...

(void) eventLoop.exec();

/// ............
}
AD Дата 2.10.2009, 16:20
  Не удается найти решение. А просто как воздух необходимо...
Помогите, пожалуйста! Этот стандартный диалог в Word, Excel, Power Point открывается моментально - это ведь значит, что проблему можно вылечить? Уже весь ассистент перелистал в поисках решения...
AD Дата 30.9.2009, 17:48
  Думаю, что все-таки есть решение этой проблемы. Ведь не тормозит точно абсолютно такое же окошко, что при вызове статической функции getOpenFileNames(), при открытии нового документа Word, Excel! Только что проверил - моментальное открытие.
AD Дата 30.9.2009, 0:29
 
Цитата(SABROG @ 30.9.2009, 1:02) *
Сетевых дисков нет?

Нет.
SABROG Дата 30.9.2009, 0:02
  Сетевых дисков нет?
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 9.12.2022, 14:47