Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] Как заставить ProgressBar перерисовываться? 
:(
    Опции темы
Elfet
Дата 23.11.2009, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Приветствую!

Как заставить ProgressBar перерисовываться в цикле? 
Пока идут другие вычисления?

Заранее спасибо!


--------------------
PM MAIL WWW Skype   Вверх
niXman
Дата 24.11.2009, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 4.7.2009

Репутация: -1
Всего: 0



Цитата(Elfet @  23.11.2009,  21:45 Найти цитируемый пост)
Пока идут другие вычисления?

Другие вычисления запихнуть в поток.
--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
chaos
Дата 24.11.2009, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 5
Всего: 44



Elfet, может проще там где идут вычисления, дергать еще 
Код

QApplication::processEvents


ЗЫ не совсем красиво, но действительно проще smile

Это сообщение отредактировал(а) chaos - 24.11.2009, 13:16
PM WWW   Вверх
W4FhLF
Дата 24.11.2009, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 4
Всего: 121



Цитата(chaos @  24.11.2009,  13:12 Найти цитируемый пост)
но действительно проще 


И действительно тормозит вычисления. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Elfet
Дата 24.11.2009, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



chaos, Нет, мне как раз пока нужно именно так.  В MFC была такая функция: invalidate. Тут нету такого аналога? 

Мне всего-лишь прогресс бар нужно перерисовать на экране.


--------------------
PM MAIL WWW Skype   Вверх
andrew_121
Дата 24.11.2009, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



Цитата(Elfet @  24.11.2009,  16:22 Найти цитируемый пост)
Мне всего-лишь прогресс бар нужно перерисовать на экране. 

Цитата(niXman @  24.11.2009,  00:15 Найти цитируемый пост)
Другие вычисления запихнуть в поток. 




--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
W4FhLF
Дата 24.11.2009, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 4
Всего: 121



Посмотри QtConcurrent::run. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Elfet
Дата 24.11.2009, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



andrew_121, неужели других вариантов нет? Кроме как в другой поток.


--------------------
PM MAIL WWW Skype   Вверх
andrew_121
Дата 24.11.2009, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



Elfet, Есть. Но это не совсем правильно. Вот, ответили:

Цитата(chaos @  24.11.2009,  13:12 Найти цитируемый пост)
Elfet, может проще там где идут вычисления, дергать еще 
QApplication::processEvents

ЗЫ не совсем красиво, но действительно проще smile



Это сообщение отредактировал(а) andrew_121 - 24.11.2009, 22:45


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
kamre
Дата 25.11.2009, 04:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 24.3.2006

Репутация: 2
Всего: 13



Цитата(chaos @ 24.11.2009,  13:12)
ЗЫ не совсем красиво, но действительно проще smile

Главное, чтобы не получилось как в поделии под названием Yast из SUSE Linux, когда время реакции на кнопку аж 20-30 секунд. Они там похоже в Qt4 front-end как раз сделали через QApplication::processEvents вместо вынесения длительных задач в отдельный thread.
PM MAIL   Вверх
andrew_121
Дата 25.11.2009, 04:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



kamre,  smile реальный пример.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Elfet
Дата 25.11.2009, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Цитата(andrew_121 @  24.11.2009,  23:44 Найти цитируемый пост)
Elfet, Есть.

Ну так подскажите, пожалуйста smile про отдельный процесс понял.


--------------------
PM MAIL WWW Skype   Вверх
null56
Дата 25.11.2009, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



на вскидку вариант без потока...
если вычисления в цикле... в конце каждой интерации попробуй вызывать
Код

void QWidget::paintEvent ( QPaintEvent * event )   [virtual protected]


я правда сам не пробовал такой способ, так что если не получится, извиняй
PM MAIL   Вверх
andrew_121
Дата 25.11.2009, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



null56, это протектед метод ;)


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
null56
Дата 26.11.2009, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



andrew_121, это как унаследуешь )
PM MAIL   Вверх
chaos
Дата 26.11.2009, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 5
Всего: 44



тема переростает во флейм? smile

топик стартеру сказали два способа решить проблему, зачем еще высасывать из пальца? smile

Цитата(kamre @  25.11.2009,  01:38 Найти цитируемый пост)
Главное, чтобы не получилось как в поделии под названием Yast из SUSE Linux, когда время реакции на кнопку аж 20-30 секунд. Они там похоже в Qt4 front-end как раз сделали через QApplication::processEvents вместо вынесения длительных задач в отдельный thread. 

ИМХО не показатель непригодности функции тк не исключены "кривые варианты использования"(не продумано место вызова например) + код не видел конечно, но вдруг автор вызвал с каким-нибудь таким параметром QEventLoop::ExcludeUserInputEvents smile

Добавлено через 2 минуты и 53 секунды
а так же 
Цитата(chaos @  26.11.2009,  09:02 Найти цитируемый пост)
Они там похоже

+ gui можно "повесить" даже если логика в другом потоке smile

PM WWW   Вверх
Elfet
Дата 26.11.2009, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



null56, я не создаю нового виджета, а использую QProgressBar.

chaos, да, я понял. Но мне нужно именно в цикле перерисовать прогресс бар - так мне сказал профессор у которого я пишу диплом. Неужели в Qt нету такой возможности? Или это так сложно?


--------------------
PM MAIL WWW Skype   Вверх
andrew_121
Дата 26.11.2009, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



Цитата(Elfet @  26.11.2009,  13:04 Найти цитируемый пост)
Неужели в Qt нету такой возможности?

Все есть. Читай второй пост.

Добавлено через 21 секунду
Цитата(Elfet @  26.11.2009,  13:04 Найти цитируемый пост)
Или это так сложно?

Проще простого.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
chaos
Дата 26.11.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 5
Всего: 44



Elfet, 

вот тебе пример того что проит твой руководитель
Код

#include <QtGui>

#define ITERATE_COUNT 300000


class ForElfet : public QWidget
{
Q_OBJECT
public:
    ForElfet()
    {
        QVBoxLayout *l = new QVBoxLayout(this);

        QPushButton *btn = new QPushButton(this);
        btn->setText(tr("Click me"));
        l->addWidget(btn);
        connect(btn, SIGNAL(clicked()), SLOT(clickHandle()));

        pb = new QProgressBar(this);
        pb->setRange(0, ITERATE_COUNT);
        l->addWidget(pb);
    }

private slots:
    void clickHandle()
    {
        for (int i = 0; i < ITERATE_COUNT; i++) {
            pb->setValue(i);
            QApplication::processEvents();
        }
    }

private:
    QProgressBar *pb;
};


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    ForElfet wnd;
    wnd.show();

    return app.exec();
}

#include "debug/main.moc"


ЗЫ smile но я солидарен с остальными отписавшимися - отдельный поток

Это сообщение отредактировал(а) chaos - 26.11.2009, 13:50
PM WWW   Вверх
Elfet
Дата 26.11.2009, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



chaos, ок! спасибо! smile Как я понял QApplication::processEvents(); - это всё равно что Invalidate для всей формы. А можно ли как-то только для прогресса? 
И насколько QApplication::processEvents()  будет тормозить всё?


--------------------
PM MAIL WWW Skype   Вверх
andrew_121
Дата 26.11.2009, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



Здесь обсуждается такая же проблема. Гляньте. Может что полезного сыщете ;)


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
chaos
Дата 26.11.2009, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 5
Всего: 44



Цитата(Elfet @ 26.11.2009,  11:19)
chaos, ок! спасибо! smile Как я понял QApplication::processEvents(); - это всё равно что Invalidate для всей формы. А можно ли как-то только для прогресса? 
И насколько QApplication::processEvents()  будет тормозить всё?

сравни
Цитата

The InvalidateRect function adds a rectangle to the specified window's update region. The update region represents the portion of the window's client area that must be redrawn.


Цитата

void QCoreApplication::processEvents ( QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents )   [static]
Processes all pending events for the calling thread according to the specified flags until there are no more events to process.

You can call this function occasionally when your program is busy performing a long operation (e.g. copying a file).

In event you are running a local loop which calls this function continuously, without an event loop, the DeferredDelete events will not be processed. This can affect the behaviour of widgets, e.g. QToolTip, that rely on DeferredDelete events to function properly. An alternative would be to call sendPostedEvents() from within that local loop.

Calling this function processes events only for the calling thread.




PM WWW   Вверх
Elfet
Дата 26.11.2009, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



chaos, ну да. в принципе похоже. Только в кюте все события пересылаются? а в mfc только перерисовывается?


--------------------
PM MAIL WWW Skype   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0764 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.