crossplatform.ru

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

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


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

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

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




Репутация:   34  


Вот гифку накатал, которая показывает в чем проблема:

~500kb


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.6.2009, 16:40
Сообщение #12


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

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

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




Репутация:   94  


поменял местами:
progressDlg.setValue(done);
progressDlg.setMaximum(total);

И запуск по progressDlg.setValue(1);

Т.е. сначала максимум, потом завершено. И стало всё путём

т.к. ты не инициализируешь диалог максимальным значением, а сразу устанавливаешь значение то потенциально оно может быть меньше умалчиваемого максимума, а функция httpDataReadProgress больше никогда не вызовится.

П.С.
connect(this, SIGNAL(requestFinished()), &progressDlg, SLOT(reset()));

у this'а нет такого сигнала
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 17.6.2009, 16:47
Сообщение #13


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

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

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




Репутация:   34  


Цитата(Litkevich Yuriy @ 17.6.2009, 17:35) *
И запуск по progressDlg.setValue(1);

А тут я не понял.

Цитата(Litkevich Yuriy @ 17.6.2009, 17:35) *
progressDlg.setValue(done);
progressDlg.setMaximum(total);


Это я поменял, но ничего не изменилось.

Цитата(Litkevich Yuriy @ 17.6.2009, 17:40) *
у this'а нет такого сигнала


Нету, я просто не тестировал этот участок он "мертв по прибытии" :)

использовал в конструкторе progressDlg.setRange(1, 100); но это не изменило ситуации.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.6.2009, 16:51
Сообщение #14


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

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

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




Репутация:   94  


Сейчас код так выглядит:
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();
        progressDlg.setValue(1);
    }
    void httpDataReadProgress(int done, int total)
    {
        qDebug() << done << total;
        progressDlg.setMaximum(total);
        progressDlg.setValue(done);

    }

Вообще поковырявшись пару месяцев назад с QProgressDialog, делаю так:
1) Объявляю указатель на него
2) В нужной функции всегда конструирую с диаппазоном 0...100:
pd = new QProgressDialog(tr("Чтение данных"), tr("Отмена"), 0, 100, this);
И соеденяю сигнал установки значения:
connect(myobject, SIGNAL(value(int)), pd, SLOT(setValue(int)));
3) Запускаю диалог так: pd->setValue(1);
4) Управляю процессом всегда посылая сигнал с зарание посчитыным процентом.
5) В завершающей функции делаю так:
pd->deleteLater();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 17.6.2009, 16:56
Сообщение #15


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

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

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




Репутация:   34  


Так ты же считерил :)

//progressDlg.exec();


Без exec() и у меня всё работает, а ты с ним попробуй. Бывают же ситуации, когда надо дождаться завершения диалога, прежде чем продолжить выполнение слота.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.6.2009, 17:07
Сообщение #16


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

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

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




Репутация:   94  


        //progressDlg.exec();
        progressDlg.setWindowModality(Qt::WindowModal);
        progressDlg.setValue(1);
Всё пучком

а с exec'ом уменя и простые вещи странно себя вели. Поэтому не пользуюсь.

вообще с exec'ом по умолчанию:
Цитата
Dialogs can be application modal (the default) or window modal.
В моём понимании всё приложение должно встать колом. соответсвенно и слоты другие тоже
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 17.6.2009, 17:49
Сообщение #17


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

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

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




Репутация:   34  


Цитата(Litkevich Yuriy @ 17.6.2009, 18:07) *
Всё пучком


Проблему можно обойти, это не вопрос. Но как бы там ни было поведение довольно странное, поэтому я отправил багрепорт.

P.S.: я сегодня уже 3 багрепорта отправил троллям :)

Сообщение отредактировал SABROG - 17.6.2009, 17:50
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 18.6.2009, 12:05
Сообщение #18


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

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

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




Репутация:   34  


Опаньки народ, получил такое письмо от троллей:

Цитата
Our focus is now on QNetworkAccessManager and QHttp will be deprecated for 4.6. Could you port your code to use QNetworkAccessManager? It should work more reliably.

If it still does not work properly, please report back

Regards,

--
Markus Goetz,
Software Engineer
Nokia, Qt Software


Класс QHttp зарубают, взамен его будет QNetworkAccessManager.
---
Переделал код на этот и все работает отлично:

#include <QtCore/QtGlobal>
#include <QtCore/QtDebug>
#include <QtCore/QUrl>
#include <QtGui/QApplication>
#include <QtGui/QProgressDialog>
#include <QtGui/QPushButton>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>

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

    }
public slots:
    void buttonClicked(bool checked = false)
    {

        QNetworkReply *reply = netmanager.get(
                QNetworkRequest(
                QUrl(
                QLatin1String(
                "http://www.qtsoftware.com/files/pdf/qt-4.4-whitepaper"
                ))));
        connect(reply, SIGNAL(downloadProgress(qint64, qint64)),
                this, SLOT(dataReadProgress(qint64, qint64)));

        progressDlg.exec();
    }
    void dataReadProgress(qint64 done, qint64 total)
    {
        qDebug() << done << total;
        progressDlg.setMaximum(total);
        progressDlg.setValue(done);
    }
private:
    QPushButton button;
    QProgressDialog progressDlg;
    QNetworkAccessManager netmanager;
};

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

#include "main.moc"


Сообщение отредактировал SABROG - 18.6.2009, 12:52
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 18.6.2009, 15:33
Сообщение #19


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

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

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




Репутация:   94  


где-то я уже слышал про рекомендацию использования QNetworkAccessManager'а, но значения не придал.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 18.6.2009, 17:35
Сообщение #20


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

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

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




Репутация:   34  


Цитата(Litkevich Yuriy @ 18.6.2009, 16:33) *
где-то я уже слышал про рекомендацию использования QNetworkAccessManager'а, но значения не придал.

Сейчас я столкнулся с некоторой проблемкой. Если скачивается целый ворох файлов, то как в этом методе определить для какого файла пришел статус?

void QNetworkReply::downloadProgress ( qint64 bytesReceived, qint64 bytesTotal ) [signal]

Раньше я использовал QHttp::currentId(), а теперь похоже придется использовать sender(). Но этот метод мне не нравится по комментариям к нему в ассистенте.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 15.1.2025, 2:27