crossplatform.ru

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

5 страниц V   1 2 3 > »   
Ответить в данную темуНачать новую тему
> [Qt 4.5.0] QHttp и QProgressDialog, странное поведение
SABROG
  опции профиля:
сообщение 17.6.2009, 11:17
Сообщение #1


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Хочу отображать QProgressDialog сразу же как пользователь нажал на кнопку типа "Скачать". Если не делать dialog.exec(), то обычно диалог появляется через 4 секунды сам (minimumDuration) или при первом step'e (изменении значения в прогрессе). Вроде бы все работает нормально за исключением того, что пользователь ждет появления диалога секунд 10, а сам диалог появляется на секунды 3. Связано это с тем, что при запросе xml файла с http сервера присходит его генерирование на основе данных в БД, а сам процесс скачивания быстрый. Так вот если все-таки делать dialog.exec(), чтобы пользователь хотябы видел, что нажатие на кнопку запустило процесс ожидания файла с сервера, то получается следующая ситуация.

По сигналу void QHttp::dataReadProgress ( int done, int total ) [signal] я меняю прогресс на диалоге. Иногда всё нормально работает и при достижении done==total диалог автоматически закрывается (типа 100% скачано). А иногда done приходит меньше, чем total, но затем следует requestFinished не дойдя до 100% и диалог остается висеть на 98-99% пока не нажмешь cancel. Ввиду разного поведения в разных ситуациях я исключаю возможность того, что сервер передает неправильный размер данных.

Сообщение отредактировал SABROG - 17.6.2009, 12:34
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 17.6.2009, 11:26
Сообщение #2


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

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

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




Репутация:   23  


SABROG,
действительно странное поведение.
так как тролли не гарантируют
Цитата
This signal is emitted when this object reads data from a HTTP server to indicate the current progress of the download.

done is the amount of data that has already arrived and total is the total amount of data. It is possible that the total amount of data that should be transferred cannot be determined, in which case total is 0.(If you connect to a QProgressBar, the progress bar shows a busy indicator if the total is 0).


то лучше наверное закрывать диалог по requestFinished()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 17.6.2009, 12:03
Сообщение #3


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Решил вывести в консоль прогресс, вот что получил:

667795/672837
670567/672837 - т.е. скачалось меньше чем заявлено, при этом приходит requestFinished.


Пардон за то, что ввёл в заблуждение, полученное значение не больше, чем должно быть, а меньше, просто по непонятным причинам приходит requestFinished. Опять проверил, если убрать dialog.exec(), то значения совпадают и все нормально, а если вернуть, то опять говорит, что считал меньше чем должно быть и диалог не исчезает.

Вообще dialog.reset() в requestFinished спасает ситуацию, но глюк то есть.
---
Заменил exec() на show(), вроде бы нормально. Похоже существует какая-то проблема между основным циклом событий и дополнительным в exec(). Событие проглатывается чтоль...

Сообщение отредактировал SABROG - 17.6.2009, 12:33
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 17.6.2009, 13:00
Сообщение #4


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

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

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




Репутация:   23  


Цитата(SABROG @ 17.6.2009, 13:03) *
Похоже существует какая-то проблема между основным циклом событий и дополнительным в exec(). Событие проглатывается чтоль...

похоже, что да. напиши письмо троллям прикрепи код, они оценят. :)
по сути в диалоге в данном случае свой поток и не нужен. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 17.6.2009, 14:03
Сообщение #5


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Прежде чем постить баг троллям попробуйте у себя тестовый код, который я накатал. Обнаружил параллельно вторую проблему, слишком маленькие файлы не закрывают диалог. Такое ощущение, что самое первое событие куда-то пропадает причем не 100% каждый раз, а может 10 раз выкачать нормально, а потом нет. Потыкайте кнопочку несколько раз (10-20).

#include <QtCore/QtGlobal>
#include <QtCore/QtDebug>
#include <QtGui/QApplication>
#include <QtGui/QProgressDialog>
#include <QtGui/QPushButton>
#include <QtNetwork/QHttp>

class MyWidget : public QWidget
{
    Q_OBJECT;
public:
    MyWidget(QWidget *parent = 0) : QWidget(parent), button(this)
                                    , progressDlg(this), http(this)
    {
        button.setText(tr("Download"));
        connect(&button, SIGNAL(clicked(bool)), this, SLOT(buttonClicked(bool)));

        connect(&http, SIGNAL(dataReadProgress(int, int))
                , this, SLOT(httpDataReadProgress(int, int)));
        connect(&progressDlg, SIGNAL(canceled()), &http, SLOT(abort()));
//        uncomment below for fixing bug
//        connect(this, SIGNAL(requestFinished()), &progressDlg, SLOT(reset()));
    }
public slots:
    void buttonClicked(bool checked = false)
    {
        http.setHost(QLatin1String("www.qtsoftware.com"));
//if download logo.png progressbar don't disappear
//http.get(QLatin1String("/logo.png"));

        http.get(QLatin1String("/files/pdf/qt-4.4-whitepaper"));
        progressDlg.exec();
    }
    void httpDataReadProgress(int done, int total)
    {
        qDebug() << done << total;
        progressDlg.setValue(done);
        progressDlg.setMaximum(total);
    }
private:
    QPushButton button;
    QProgressDialog progressDlg;
    QHttp http;
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyWidget widget;
    widget.show();
    return a.exec();
}

#include "main.moc"

Прикрепленные файлы
Прикрепленный файл  progressDialogBug.zip ( 1.05 килобайт ) Кол-во скачиваний: 111
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.6.2009, 14:16
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


QProgressDialog вообще чудной,
У меня инициализирован так:
pd = new QProgressDialog(tr("Чтение данных"), tr("Отмена"), 0, 100, this);

Дак вот на одной из 4 машин, а именно ноутбуке с ВинХП3, вместо "Отмена" написано "Cancel" откуда она взялась эта надпись?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 17.6.2009, 14:24
Сообщение #7


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Откуда берется понятно:

void QProgressDialogPrivate::retranslateStrings()
{
    Q_Q(QProgressDialog);
    if (useDefaultCancelText)
        q->setCancelButtonText(QProgressDialog::tr("Cancel"));
}


А вот почему, это вопрос:

class QProgressDialogPrivate : public QDialogPrivate
{
    Q_DECLARE_PUBLIC(QProgressDialog)

public:
    QProgressDialogPrivate() : label(0), cancel(0), bar(0),
        shown_once(false),
        cancellation_flag(false),
        showTime(defaultShowTime),
#ifndef QT_NO_SHORTCUT
        escapeShortcut(0),
#endif
        useDefaultCancelText(false)
    {
    }


Ты ведь не используешь этот конструктор?

QProgressDialog::QProgressDialog(QWidget *parent, Qt::WindowFlags f)
    : QDialog(*(new QProgressDialogPrivate), parent, f)
{
    Q_D(QProgressDialog);
    d->useDefaultCancelText = true;
    d->init(QString::fromLatin1(""), QString(), 0, 100);
}


Похоже, что проблема в твоей винде, она видимо английская:

void QProgressDialog::changeEvent(QEvent *ev)
{
    Q_D(QProgressDialog);
    if (ev->type() == QEvent::StyleChange)
        d->layout();
    else if (ev->type() == QEvent::LanguageChange)
        d->retranslateStrings(); // тута насильная установка текста Cancel
    QDialog::changeEvent(ev);
}


Вообще не правильное поведение, щас напишу багрепорт.

Сообщение отредактировал SABROG - 17.6.2009, 14:30
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.6.2009, 14:43
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Может оно и из-за английской (пиратская)
Но у меня и текст "Чтение данных" заменён на умалчиваемый, что типа: "Process in progress, pease wite"
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 17.6.2009, 15:13
Сообщение #9


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Цитата(Litkevich Yuriy @ 17.6.2009, 15:43) *
Но у меня и текст "Чтение данных" заменён на умалчиваемый, что типа: "Process in progress, pease wite"


А разве у QProgressDialog вообще есть умалчиваемый текст, я не нашел?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.6.2009, 15:23
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(SABROG @ 17.6.2009, 19:13) *
я не нашел?
ну тем интереснее, я когда увидел, думал, что скопировал из примера а свой написать забыл, проверил исходники - всё по-русски.
Тогда перетащил каталог на другую машину и запустил - вижу русский текст. Загадка.

У меня даже запись в рабочем SVN'е такая:
Цитата
* Добавил окно процесса, но фигня там какая-то.
:)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 16.6.2024, 5:18