Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/107: Рейтинг темы: голосов - 107, средняя оценка - 4.83
6 / 6 / 1
Регистрация: 29.11.2010
Сообщений: 101
1

ProgressBar и таймер

22.02.2012, 05:26. Показов 21000. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
всем доброго времени суток! не знаю существует ли такая тема , но тем не менее хотелось бы получить ответ на следующий вопрос. на Qt на форме есть ProgressBar как заставить с помощью QTimer'а изменять значения ProgressBar'а ??? прошу меня извинить если вопрос некорректный!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.02.2012, 05:26
Ответы с готовыми решениями:

Qt - ProgressBar
Функция считывания большого текстового файла и разделения на слова. QFile dictionary(path); ...

Собственный ProgressBar
Здравствуйте! Собственно суть такова, что мне нужно, что бы в прогресс баре в зависимости от...

QThread и ProgressBar
Делаю пример использования потоков из книги Шлее class MyThread :public QThread {...

ProgressBar + библиотека С
Есть однопоточное Qt-приложение (фактически GUI к библиотеке), к которому динамически подгружается...

17
109 / 36 / 3
Регистрация: 08.08.2009
Сообщений: 134
22.02.2012, 09:41 2
Попробуй создать свой слот в котором будешь менять прогресс бар по таймеру и привяжи его к сигналу таймера timeout().
0
Автор FAQ
2732 / 1428 / 89
Регистрация: 08.09.2011
Сообщений: 3,746
Записей в блоге: 1
22.02.2012, 10:01 3
Цитата Сообщение от flack Посмотреть сообщение
Попробуй создать свой слот в котором будешь менять прогресс бар по таймеру и привяжи его к сигналу таймера timeout().
А по другому будет уже не очень правильно, как мне кажется....
0
6 / 6 / 1
Регистрация: 29.11.2010
Сообщений: 101
22.02.2012, 13:45  [ТС] 4
Цитата Сообщение от flack Посмотреть сообщение
Попробуй создать свой слот в котором будешь менять прогресс бар по таймеру и привяжи его к сигналу таймера timeout().
для этого мне нужен класс типа QTimer?
0
Эксперт С++
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
22.02.2012, 13:49 5
нуу... как сказать, можно QTimer::singleShoot использовать
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
22.02.2012, 13:53 6
QTimeLine куда удобнее для этого дела чем просто таймер
1
6 / 6 / 1
Регистрация: 29.11.2010
Сообщений: 101
22.02.2012, 15:12  [ТС] 7
попробую поколдовать

Добавлено через 59 минут
парни пример покажите если не трудно... а то уже голова кругом ниче не понимаю... я ток начал изучать Qt
0
109 / 36 / 3
Регистрация: 08.08.2009
Сообщений: 134
22.02.2012, 15:45 8
У меня такой пример получился:

main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "MainClass.h"
#include <QtGui/QApplication>
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainClass w;
    w.show();
    return a.exec();
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
MainClass.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#ifndef MAINCLASS_H
#define MAINCLASS_H
//------------------------------------------------------------------------------
#include <QtGui/QWidget>
 
#include <QLayout>
#include <QProgressBar>
#include <QTimer>
//------------------------------------------------------------------------------
class MainClass : public QWidget
{
    Q_OBJECT
 
public:
    MainClass(QWidget *parent = 0, Qt::WFlags flags = 0);
    ~MainClass();
 
private:
    QHBoxLayout main_layout;
    QProgressBar progress_bar;
    QTimer timer;
 
    private slots:
        void TimerTick( void );
};
 
#endif // MAINCLASS_H
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
MainClass.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//------------------------------------------------------------------------------
#include "MainClass.h"
//------------------------------------------------------------------------------
MainClass::MainClass(QWidget *parent, Qt::WFlags flags)
    : QWidget(parent, flags)
{
    main_layout.addWidget(&progress_bar);
    setLayout(&main_layout);
    
    progress_bar.setMinimum(0);
    progress_bar.setMaximum(10);
    QObject::connect(&timer, SIGNAL(timeout()), SLOT(TimerTick()));
    timer.setInterval(100);
    timer.start();
}
//------------------------------------------------------------------------------
MainClass::~MainClass()
{
 
}
//------------------------------------------------------------------------------
void MainClass::TimerTick( void )
{
    if( progress_bar.value() >= progress_bar.maximum() ) progress_bar.reset();
    progress_bar.setValue(progress_bar.value()+1);
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
1
6 / 6 / 1
Регистрация: 29.11.2010
Сообщений: 101
22.02.2012, 15:51  [ТС] 9
это с использованием QWidget? а с использованием QMainWindow будет так же??
0
109 / 36 / 3
Регистрация: 08.08.2009
Сообщений: 134
22.02.2012, 16:28 10
Изменения небольшие, но на всякий залью полный текст, обрати внимание что у меня прогрес бар называется progressBarFF(чтобы непонятностей не возникло) и то что я его прямо в кострукторе формы кинул:

main.cpp - тот же

MainClass.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#ifndef MAINCLASS_H
#define MAINCLASS_H
//------------------------------------------------------------------------------
#include <QtGui/QMainWindow>
#include "ui_mainclass.h"
//------------------------------------------------------------------------------
#include <QTimer>
//------------------------------------------------------------------------------
class MainClass : public QMainWindow
{
    Q_OBJECT
 
public:
    MainClass(QWidget *parent = 0, Qt::WFlags flags = 0);
    ~MainClass();
 
private:
    Ui::MainClassClass ui;
 
    QTimer timer;
 
private slots:
    void TimerTick( void );
};
//------------------------------------------------------------------------------
#endif // MAINCLASS_H
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//------------------------------------------------------------------------------
#include "MainClass.h"
//------------------------------------------------------------------------------
MainClass::MainClass(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
    ui.setupUi(this);
 
    ui.progressBarFF->setMinimum(0);
    ui.progressBarFF->setMaximum(10);
 
    QObject::connect(&timer, SIGNAL(timeout()), SLOT(TimerTick()));
    timer.setInterval(100);
    timer.start();
}
//------------------------------------------------------------------------------
MainClass::~MainClass()
{
 
}
//------------------------------------------------------------------------------
void MainClass::TimerTick( void )
{
    if( ui.progressBarFF->value() >= ui.progressBarFF->maximum() ) ui.progressBarFF->reset();
    ui.progressBarFF->setValue(ui.progressBarFF->value()+1);
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
1
6 / 6 / 1
Регистрация: 29.11.2010
Сообщений: 101
24.02.2012, 02:51  [ТС] 11
с этим разобрался спс! вот теперь вопрос другой. вот листинг моей проги
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "dialog.h"
#include "ui_dialog.h"
 
#include <QTGui>
#include <QtCore>
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    ui->progressBar->setMinimum(0);
    ui->progressBar->setValue(0);
    ui->progressBar->setMaximum(100);
    timer.stop();
 
}
  int i;
Dialog::~Dialog()
{
    delete ui;
}
 void Dialog::Prog(void)
 {
     if (ui->progressBar->value()>=ui->progressBar->maximum())
     {int val = QMessageBox::question(this,"Внимание","Это конец! нажми Да чтобы выйти и Нет для повтора",QMessageBox::Yes|QMessageBox::No);
         if (val == QMessageBox::Yes) Dialog::close();
     else ui->progressBar->reset();}
     else
     ui->progressBar->setValue(ui->progressBar->value()+1); 
 }
 
void Dialog::on_pushButton_clicked()
{
 
    timer.start(500); //вот как сделать чтоб при повторном нажатии здесь таймер не запускался заново (поверх него)????
    QObject::connect(&timer,SIGNAL(timeout()),SLOT(Prog()));
   }
 
void Dialog::on_pushButton_2_clicked()
{
    timer.stop();
    ui->progressBar->setValue(0);
}
0
109 / 36 / 3
Регистрация: 08.08.2009
Сообщений: 134
24.02.2012, 08:52 12
для этого у таймера есть свойство isActive(); просто проверяй его
C++
1
2
    if( !timer.isActive() )
        timer.start();
PS старайся не писать вопросы в коментариях, а то не сразу разберёшся был ли вообще вопрос)
0
6 / 6 / 1
Регистрация: 29.11.2010
Сообщений: 101
24.02.2012, 13:02  [ТС] 13
Цитата Сообщение от flack Посмотреть сообщение
для этого у таймера есть свойство isActive(); просто проверяй его
C++
1
2
    if( !timer.isActive() )
        timer.start();
PS старайся не писать вопросы в коментариях, а то не сразу разберёшся был ли вообще вопрос)


не работает.....
0
109 / 36 / 3
Регистрация: 08.08.2009
Сообщений: 134
24.02.2012, 13:09 14
Выложи код посмотреть, потому что у меня всё отработало
0
Почетный модератор
11525 / 4320 / 448
Регистрация: 12.06.2008
Сообщений: 12,412
24.02.2012, 13:29 15
Скорее всего, проблема не в повторном timer.start, а в повторном QObject::connect
Проще всего в on_pushButton_2_clicked() добавить
C++
1
QObject::disconnect(&timer,SIGNAL(timeout()),SLOT(Prog()));
0
109 / 36 / 3
Регистрация: 08.08.2009
Сообщений: 134
24.02.2012, 13:41 16
Тогда лучше будет connect в конструктор перенести, чтобы дисконнекты по функциям не отлавливать.
1
Почетный модератор
11525 / 4320 / 448
Регистрация: 12.06.2008
Сообщений: 12,412
24.02.2012, 13:44 17
Цитата Сообщение от flack Посмотреть сообщение
Тогда лучше будет connect в конструктор перенести, чтобы дисконнекты по функциям не отлавливать.
Согласен
0
6 / 6 / 1
Регистрация: 29.11.2010
Сообщений: 101
24.02.2012, 14:22  [ТС] 18
перенес в конструктор

сработало спс
0
24.02.2012, 14:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.02.2012, 14:22
Помогаю со студенческими работами здесь

ProgressBar / C++ / Qt Creator
Решаю задачку поэтапно. и на одном из них встала. Вообщем суть такова. В диалоговом окошке я...

ProgressBar в параллельном потоке
Здравствуйте, пишу на qt 3.3 . Необходимо сделать прогресс бар при записи на двд диск под...

ProgressBar в виде окружности
Здравствуйте. Можно ли создать ProgressBar в виде окружности, если да то подкиньте пример?

Почему индикатор ProgressBar изменяется скачком?
Собственно суть проблемы в том, что индикатор ProgressBar неадекватно отображает процесс. Т.е. при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru