crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

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


Последние 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 Рейтинг@Mail.ru Текстовая версия Сейчас: 5.7.2025, 4:35