crossplatform.ru

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

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
> Проблемы с функцией QFileDialog::getOpenFileName, при нестабильной работе сети
AD
  опции профиля:
сообщение 6.10.2009, 10:30
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Полез в исходники 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
  опции профиля:
сообщение 6.10.2009, 13:53
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Тут возник вопрос такой! :) есть ли возможность программно отключать сеть на время работы этого диалога? Т.е. есть ли возможности включения/выключения сети ПРОГРАММНО?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 6.10.2009, 16:30
Сообщение #13


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Я бегло просмотрел асситент. не обнаружил.
если и ты не найдешь по форумам и в ассистенте, то могу предложить стопнуть сеть через внешний процесс. :)
с помощью объекта класса QProcess()


П.С.
вот такие костыли :)

Сообщение отредактировал kwisp - 6.10.2009, 16:31
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 6.10.2009, 17:10
Сообщение #14


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Понимаю, что неидеальное решение, но попробовать стоит! Попробую через Windows функцию GetOpenFileName реализовать диалог открытия. Если повезет, то такой вариант и оставлю. Если вдруг буду переносить код, то реализую подобные функции-обертки для Linux, Unix, MacOS! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 6.10.2009, 17:44
Сообщение #15


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Ура! :) Стандартная функция Windows GetOpenFileName работает отлично! :)

P.S. Выходит, что-то у троллей с QFileDialog не так! Надо будет отчет об ошибке отправить.
Юра, ты ведь уже подобные вещи отправлял! Сможешь отправить баг-репорт? Ну смысл ошибки ты уже знаешь по этой теме!

Сообщение отредактировал AD - 6.10.2009, 17:48
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 7.10.2009, 8:23
Сообщение #16


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Вот реализация "оберток":
/// Вызов окна диалога для выбора открываемого файла
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;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V  < 1 2
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.12.2022, 16:05