Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с QProgressBar 
V
    Опции темы
m9yt
Дата 5.11.2010, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Всем привет.
Есть у меня некая прога, на которой фигурки меняются через различные промежутки времени.
Как сделать так, чтобы в тот промежуток, в течение которого фигурки не меняются, ProgressBar мог заполниться?
Пример:
промежуток 1.2 с - заполнение до 100% за 1.2 с
промежуток 2.4 с - заполнение до 100% за 2.4 с
и т.д.
PM MAIL   Вверх
borisbn
Дата 5.11.2010, 06:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 48
Всего: 135



Делаешь startTimer с интервалом 1/10 от нужного времени. В timerEvent увеличиваешь прогресс на 10%. Если достиг 100, делаешь killTimer


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
m9yt
Дата 5.11.2010, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(borisbn @ 5.11.2010,  06:41)
Делаешь startTimer с интервалом 1/10 от нужного времени. В timerEvent увеличиваешь прогресс на 10%. Если достиг 100, делаешь killTimer

"А ничего, что у меня в timerEvent уже есть какие-либо действия?" Если я стартую новый таймер следом за старым, то фигуры у меня начинают двигаться в 10 раз быстрее.
PM MAIL   Вверх
m9yt
Дата 5.11.2010, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Проблему решил с помощью сравнивания event->timerId() ну и, соответственно, ввода нового таймера.

Это сообщение отредактировал(а) m9yt - 5.11.2010, 12:29
PM MAIL   Вверх
borisbn
Дата 5.11.2010, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 48
Всего: 135



startTimer возвращает id созданного ( запущенного ) таймера. Нужно запоминать этот id
Код

m_oneTimerID = startTimer();
m_otherTimerID = startTimer();

в timerEvent можно узнать id таймера, вызвавшего это событие
Код

if ( event->timerId() == m_oneTimerID ) 
    doOne();
if ( event->timerId() == m_otherTimerID ) 
    doOther();



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
m9yt
Дата 5.11.2010, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(borisbn @ 5.11.2010,  12:28)
startTimer возвращает id созданного ( запущенного ) таймера. Нужно запоминать этот id
Код

m_oneTimerID = startTimer();
m_otherTimerID = startTimer();

в timerEvent можно узнать id таймера, вызвавшего это событие
Код

if ( event->timerId() == m_oneTimerID ) 
    doOne();
if ( event->timerId() == m_otherTimerID ) 
    doOther();

Одновременно ответили)
PM MAIL   Вверх
borisbn
Дата 5.11.2010, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 48
Всего: 135



smile


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
m9yt
Дата 5.11.2010, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Вот засада! Ставлю таймер на 1200 мс, всё синхронно меняется. Ставлю на 3600 - ProgressBar начинает опаздывать! (засек секундомером - более 4 сек выходит). Странно

Это сообщение отредактировал(а) m9yt - 5.11.2010, 13:27
PM MAIL   Вверх
borisbn
Дата 5.11.2010, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 48
Всего: 135



показывай. только вырежи лишнее


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
m9yt
Дата 5.11.2010, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(borisbn @ 5.11.2010,  14:07)
показывай. только вырежи лишнее

Юзал creator, на форму кидал 1 кнопку и прогресс бар.
Вначале вроде совпадает, но через некоторое время прогресс бар отстает
Код

//widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTimer>

namespace Ui {
    class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    virtual void paintEvent(QPaintEvent *event);
    virtual void timerEvent(QTimerEvent *event);
    ~Widget();
    int timer;
    int timer2;

private:
    Ui::Widget *ui;

private slots:
    void on_pushButton_clicked();
};

#endif // WIDGET_H


Код

//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QKeyEvent>
#include <QTimer>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

int R=0, i=0;

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter paint;
    paint.begin(this);
    paint.setFont(QFont("Times New Roman", 12, QFont::Bold));
    QRect r = QRect(100, 10, 220, 20);
    QPen pen(Qt::black, 1, Qt::SolidLine);
    QBrush brush(Qt::red, Qt::SolidPattern);
    paint.setRenderHint(QPainter::Antialiasing);
    switch (R){
    case 1:
        {
            paint.setBrush(brush);
            paint.setPen(pen);
            paint.drawText(r, this->tr("Прямоугольник"));
            paint.drawRect(30,40, 250, 100);
            break;
        }
    case 2:
        {
            brush.setColor(Qt::yellow);
            paint.setBrush(brush);
            r = QRect(130, 10, 220, 20);
            paint.drawText(r, this->tr("Эллипс"));
            paint.drawEllipse(QPoint(150, 90), 100, 50);
            break;
        }
    }
    paint.end();
}

void Widget::timerEvent(QTimerEvent *event)
{
    if (event->timerId() == timer2)
    {
        if (i==100) i=0;
        i=i+10;
        ui->progressBar->setValue(i);
    }
    if (event->timerId() == timer)
    {
        if (R==2) R=0;
        R=R+1;
        this->repaint();
    }
}

void Widget::on_pushButton_clicked()
{
    timer2 = startTimer(240);
    timer = startTimer(2400);
    ui->pushButton->~QPushButton();
}

Код

//main.cpp
#include <QtGui/QApplication>
#include "widget.h"
#include <QTextCodec>

int main(int argc, char *argv[])
{
    QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows1251"));
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}


Это сообщение отредактировал(а) m9yt - 5.11.2010, 14:44
PM MAIL   Вверх
borisbn
Дата 5.11.2010, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 48
Всего: 135



Может тогда проще запускать один таймер

Код

void Widget::timerEvent(QTimerEvent *event)
{
    if (event->timerId() == timer2)
    {
        i=i+10;
        ui->progressBar->setValue(i);

        if (i==100)
        {
           i=0;
           if (R==2) R=0;
           R=R+1;
           this->repaint();
        }

    }
}

void Widget::on_pushButton_clicked()
{
    timer2 = startTimer(240);
    //ui->pushButton->~QPushButton(); // НЕОЖИДАННО ???
}



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
SABROG
Дата 5.11.2010, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

Репутация: 81
Всего: 91



Имхо стоит присмотреться к классу QTimeLine.

По коду:

Код

int R=0, i=0;
void Widget::paintEvent(QPaintEvent *event)
{

R и i  сделать членами класса не судьба? Да и R, по-хорошему, должен быть enum'ом.

Код

    QPainter paint;
    paint.begin(this);
...
paint.end();


Код избыточен. Конструктор QPainter автоматически вызывает begin(), а деструктор end().


Код

QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows1251"));
...
this->tr("Прямоугольник")


Как я понимаю это следствие попытки заставить Qt понимать кодировку Windows-1251. Почитайте этот пост. this везде и вся прописывать не нужно, он и так подразумевается автоматически.

Код

this->repaint();


Лучше вызывать update().

Код

ui->pushButton->~QPushButton();


А тут у меня вообще нет слов. Пользуйте ui->pushButton->deleteLater(), если так надо удалить кнопку.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
m9yt
Дата 5.11.2010, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(SABROG @ 5.11.2010,  15:50)
Код

ui->pushButton->~QPushButton();


А тут у меня вообще нет слов. Пользуйте ui->pushButton->deleteLater(), если так надо удалить кнопку.

Чем же деструктор не устраивает?

borisbn, спс.

Это сообщение отредактировал(а) m9yt - 5.11.2010, 16:02
PM MAIL   Вверх
borisbn
Дата 5.11.2010, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 48
Всего: 135



Цитата(m9yt @  5.11.2010,  15:58 Найти цитируемый пост)
Чем же деструктор не устраивает?

Этим
см. второй Warning

Цитата

Warning: Deleting a QObject while pending events are waiting to be delivered can cause a crash. You must not delete the QObject directly if it exists in a different thread than the one currently executing. Use deleteLater() instead, which will cause the event loop to delete the object after all pending events have been delivered to it.


и потом ( если бы это было не в слоте )
Код

delete ui->pushButton;

выглядет приятнее, чем
Код

ui->pushButton->~QPushButton();



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
SABROG
Дата 5.11.2010, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


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

Репутация: 81
Всего: 91



Цитата(borisbn @  5.11.2010,  17:18 Найти цитируемый пост)
выглядет приятнее, чем

Дело даже не в Qt, а в C++. Прямой вызов деструктора объекта не освобождает память выделенный под объект. Смысл вызывать деструктор напрямую есть только в том случае, если вы сами знаете как освободить память, например в случае использования "placement new".


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

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

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


 




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


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

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