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

Enum

11.04.2016, 17:39. Показов 779. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Мне нужно чтобы при нажатии : Старт кнопка меняла названия : Пауза, А при нажатии пауза меняла на : Продолжить. Я написал как думаю, но при нажатии на кнопку не меняется значения. Подскажите как пофиксить это
C++ (Qt)
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
#ifndef PROGRESSBAR_H
#define PROGRESSBAR_H
 
#include <QtWidgets>
 
class ProgressWindow : public QWidget
{
    Q_OBJECT
 
public:
    enum ActionState
    {
        START,
        PAUSE,
        CONTINUE
    };
    ProgressWindow(QWidget *parent = 0);
 
public slots:
    void startAction();
    void cancelAction();
    void timeUpdate();
 
private:
    QLabel* mTimeLabel;
    QTimer* mTimer;
    QProgressBar* mProgressBar;
    QPushButton* mStartButton;
    QPushButton* mCancelButton;
    int mStep;
    ActionState actionState = ActionState::START;
};
 
#endif // PROGRESSBAR_H
C++ (Qt)
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include "ProgressWindow.h"
 
ProgressWindow::ProgressWindow(QWidget *parent)
    : QWidget(parent)
    , mStep(0)
{
    mTimeLabel = new QLabel();
    mTimeLabel->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
 
    mTimer = new QTimer();
 
    mProgressBar = new QProgressBar;
    mProgressBar->setRange(0, 5);
    mProgressBar->setMinimumWidth(200);
    mProgressBar->setAlignment(Qt::AlignCenter);
    mProgressBar->setMaximum(0);
    mProgressBar->setMaximum(60);
 
    mStartButton = new QPushButton("&Start");
    mStartButton->setCheckable(true);
    mCancelButton = new QPushButton("&Cancel");
 
    QHBoxLayout* layout = new QHBoxLayout;
    layout->addWidget(mTimeLabel);
    layout->addWidget(mProgressBar);
    layout->addWidget(mStartButton);
    layout->addWidget(mCancelButton);
    setLayout(layout);
 
    connect(mStartButton, SIGNAL(clicked()), SLOT(startAction()));
    connect(mCancelButton, SIGNAL(clicked()), SLOT(cancelAction()));
    connect(mTimer, SIGNAL(timeout()), SLOT(timeUpdate()));
}
 
void ProgressWindow::startAction()
{
    if (actionState == ActionState::START)
    {
        mTimer->start(1000);
    }
    else if (actionState == ActionState::PAUSE)
    {
        mStartButton->setText("&Continue");
        mTimer->stop();
    }
    else if (actionState == ActionState::CONTINUE)
    {
        mStartButton->setText("&Pause");
        mTimer->start(1000);
    }
}
 
void ProgressWindow::cancelAction()
{
    close();
}
 
void ProgressWindow::timeUpdate()
{
    QTime time;
    QTime elapsedTime;
    QTime currentTime;
    QTime prevTime;
    QString text;
    currentTime = time.fromMSecsSinceStartOfDay(60000);
    prevTime = time.fromMSecsSinceStartOfDay(60000);
    elapsedTime = currentTime - prevTime;
    ++mStep;
    if(mStep < 59)
        text = time.fromString(tr("%1:%2").arg(0).arg(mStep),"m:s").toString("mm:ss");
 
    mTimeLabel->setText(text);
    mProgressBar->setValue(mStep);
 
    if(mStep > 59)
    {
        mStartButton->setChecked(false);
        startAction();
        mStep = 0;
    }
}
Часть кода где я делаю и у меня не меняется
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void ProgressWindow::startAction()
{
    if (actionState == ActionState::START)
    {
        mTimer->start(1000);
    }
    else if (actionState == ActionState::PAUSE)
    {
        mStartButton->setText("&Continue");
        mTimer->stop();
    }
    else if (actionState == ActionState::CONTINUE)
    {
        mStartButton->setText("&Pause");
        mTimer->start(1000);
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.04.2016, 17:39
Ответы с готовыми решениями:

При создании enum 'имя1' class 'имя2' ошибка use of enum 'имя1' without previous declaration
Добрый день. пишу в qt5: enum typeTable class tabty{readtxt,is,wb,wa,tp}; При сборке...

Qt Creator Enum C++
Всем доброго времени суток. У меня небольшой вопросик насчет самой среды Qt Creator. При...

Enum to QVariant
Погуглил и как то не помогло. Есть некий enum (файл target.h): enum class Ready{completed,...

Could not convert Enum to QVariant
Всем добрый день! Есть класс содержащий следующую структуру данных: class ActiveTradeOffer :...

19
2 / 2 / 0
Регистрация: 23.01.2015
Сообщений: 60
11.04.2016, 17:49 2
dimanazer, у тебя значение actionState по-умолчанию — START. Я не вижу в программе места, в котором оно может поменяться на какое-то другое. Единственное место, где значение вообще меняется, меняет его при условии того, что оно PAUSE, либо CONTINUE.
0
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 86
11.04.2016, 17:57  [ТС] 3
MongrellProg, от от, я не знаю как
C++ (Qt)
1
actionState
менять. Подскажете как сделать что бы работало правильно? Мне в ифах нужно менять при проверке. но я незнаю как правильно сделать
0
2 / 2 / 0
Регистрация: 23.01.2015
Сообщений: 60
11.04.2016, 18:03 4
dimanazer, как менять... actionState = новое значение, как обычно.
0
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 86
11.04.2016, 18:07  [ТС] 5
MongrellProg, я не могу понять что место actionState нужно писать в ифы. Наведите пример
0
68 / 68 / 17
Регистрация: 20.01.2015
Сообщений: 347
11.04.2016, 19:16 6
C++ (Qt)
1
2
3
4
5
    if (actionState == ActionState::START)
    {
        actionState = ActionState::PAUSE
        mTimer->start(1000);
    }
0
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 86
11.04.2016, 19:31  [ТС] 7
Amok, сделал, ничего не изменяется
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void ProgressWindow::startAction()
{
    if (actionState == ActionState::START)
    {
        actionState = ActionState::PAUSE;
        mTimer->start(1000);
    }
    else if (actionState == ActionState::PAUSE)
    {
        actionState = ActionState::CONTINUE;
        mTimer->stop();
    }
    else if (actionState == ActionState::CONTINUE)
    {
        actionState = ActionState::PAUSE;
        mTimer->start(1000);
    }
}
0
68 / 68 / 17
Регистрация: 20.01.2015
Сообщений: 347
11.04.2016, 19:42 8
C++ (Qt)
1
mStartButton->setText("&Pause")
Туда-же.
0
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 86
11.04.2016, 19:48  [ТС] 9
Amok, благодарю, все работает))
Теперь еще мне 2 нужно подправить, таймер нужно сделать через функцию fromMSecsSinceStartOfDay. Я так делаю. Но походу я неправильно делаю)
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void ProgressWindow::timeUpdate()
{
    QTime time;
    QTime elapsedTime;
    QTime currentTime;
    QTime prevTime;
    QString text;
    currentTime = time.fromMSecsSinceStartOfDay(60000);
    prevTime = time.fromMSecsSinceStartOfDay(60000);
    //elapsedTime = currentTime - prevTime;
    ++mStep;
    if(mStep < 59)
        text = time.fromString(tr("%1:%2").arg(0).arg(mStep),"m:s").toString("mm:ss");
 
    mTimeLabel->setText(text);
    mProgressBar->setValue(mStep);
 
    if(mStep > 59)
    {
        mStartButton->setChecked(false);
        startAction();
        mStep = 0;
    }
}
Добавлено через 1 минуту
Мой алгоритм. Насколько я понял функция возвращает миллисекунды времени от начала дня. Я создаю переменную в которую записываю начало . в вторую переменную записываю другое значение этой функции и в третю записываю разницу времени от 1 и 2 перемен.
0
68 / 68 / 17
Регистрация: 20.01.2015
Сообщений: 347
11.04.2016, 19:56 10
Не хочу вникать зачем там fromMSecsSinceStartOfDay, но раз надо, значит надо. Таймер сделать просто:
C++ (Qt)
1
2
3
4
QElapsedTimer timer;
timer.start();
 
if (timer.elapsed()>=1000) break;
Добавлено через 2 минуты
currentTime и prevTime у тебя всегда равны. time.fromMSecsSinceStartOfDay(60000) возвращает не текущее время, а переменную времени в которой с начала дня прошло 60000 мс.
0
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 86
11.04.2016, 19:59  [ТС] 11
Amok, а мне и нужно чтобы оно возвращало какое-то значение. Мне таймер на 1 мин нужен. А как возвращать такущее время? А функцией мне препод сказал делать. Так как в винде приоритеты запуска разные и не факт что моя прога через 1 сек запуститься. Как то так он сказал)
0
68 / 68 / 17
Регистрация: 20.01.2015
Сообщений: 347
11.04.2016, 20:06 12
currentTime = time.fromMSecsSinceStartOfDay();

потом if (currentTime+60000<= time.fromMSecsSinceStartOfDay()) то время прошло. Но это тупо.
0
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 86
11.04.2016, 20:09  [ТС] 13
Amok, http://doc.qt.io/qt-5/qtime.ht... StartOfDay должно на вход значение
0
68 / 68 / 17
Регистрация: 20.01.2015
Сообщений: 347
11.04.2016, 20:12 14
dimanazer, http://doc.qt.io/qt-5/qtime.ht... StartOfDay

Добавлено через 59 секунд
Да, без from. Ну там же ссылка прямо внизу.
0
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 86
11.04.2016, 20:15  [ТС] 15
Amok, а они однаковые? Просто мой препод именно с from сказал
0
68 / 68 / 17
Регистрация: 20.01.2015
Сообщений: 347
11.04.2016, 20:20 16
prevTime = QTime::currentTime();

if (prevTime+time.fromMSecsSinceStartOfDay(60000)>= QTime::currentTime()) время прошло. Вариант применения этого метода - тупой.
0
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 86
11.04.2016, 21:55  [ТС] 17
Amok, переделал я немного свой код. решил как с функцией той сделать. Теперь проблема как теперь на екран мою переменную выводить таймер(смотреть коменты в коде где я что переделал)
C++ (Qt)
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "ProgressWindow.h"
 
ProgressWindow::ProgressWindow(QWidget *parent)
    : QWidget(parent)
    , mStep(0)
    , mActionState(ActionState::WAITING)
    , mPrevTime(0)
{
    mTimeLabel = new QLabel();
    mTimeLabel->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
    mTimeLabel->setText("00:00");
 
    mTimer = new QTimer();
 
    mProgressBar = new QProgressBar;
    mProgressBar->setRange(0, 5);
    mProgressBar->setMinimumWidth(200);
    mProgressBar->setAlignment(Qt::AlignCenter);
    mProgressBar->setMaximum(0);
    mProgressBar->setMaximum(60);
 
    mStartButton = new QPushButton("&Start");
    mStartButton->setCheckable(true);
    mCancelButton = new QPushButton("&Cancel");
 
    QHBoxLayout* layout = new QHBoxLayout;
    layout->addWidget(mTimeLabel);
    layout->addWidget(mProgressBar);
    layout->addWidget(mStartButton);
    layout->addWidget(mCancelButton);
    setLayout(layout);
 
    connect(mStartButton, SIGNAL(clicked()), SLOT(startAction()));
    connect(mCancelButton, SIGNAL(clicked()), SLOT(cancelAction()));
    connect(mTimer, SIGNAL(timeout()), SLOT(timeUpdate()));
}
 
void ProgressWindow::startAction()
{
    static const int updateDelay = 500;
    if (mActionState == ActionState::WAITING)
    {
        mPrevTime = mTime.msecsSinceStartOfDay(); //тут  на самом начале первое значение
        mActionState = ActionState::RUNNING;
        mStartButton->setText("&Pause");
        mTimer->start(updateDelay);
    }
    else if (mActionState == ActionState::RUNNING)
    {
        mActionState = ActionState::PAUSED;
        mStartButton->setText("&Continue");
        mTimer->stop();
    }
    else if (mActionState == ActionState::PAUSED)
    {
        mActionState = ActionState::RUNNING;
        mStartButton->setText("&Pause");
        mTimer->start(updateDelay);
    }
}
 
void ProgressWindow::cancelAction()
{
    close();
}
 
void ProgressWindow::timeUpdate()
{
    int currentTime = mTime.msecsSinceStartOfDay(); // второе мое значение
    int elapsedTime = currentTime - mPrevTime; // отнимаю разницу. Как мне прикрутить elapsedTime  к выводу таймера на екран?
 
    QString text;
 
    ++mStep;
    if(mStep < 59)
        text = mTime.fromString(tr("%1:%2").arg(0).arg(mStep),"m:s").toString("mm:ss");
    else
        text = mTime.fromString(tr("%1:%2").arg(1).arg(0),"m:s").toString("mm:ss");
 
    mTimeLabel->setText(text);
    mProgressBar->setValue(mStep);
 
    if(mStep > 59)
    {
        mActionState = ActionState::COMPLETED;
        mStep = 0;
    }
}
0
68 / 68 / 17
Регистрация: 20.01.2015
Сообщений: 347
11.04.2016, 22:05 18
http://doc.qt.io/qt-5/qlabel.html
http://doc.qt.io/qt-5/qlcdnumber.html

Читать и изучать.
0
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 86
12.04.2016, 10:39  [ТС] 19
Amok, понимаете, в чем проблема переменная у меня elapsedTime int. И как ее через QLabel выводить на екран я не пойму
0
68 / 68 / 17
Регистрация: 20.01.2015
Сообщений: 347
13.04.2016, 19:38 20
QString::number
0
13.04.2016, 19:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.04.2016, 19:38
Помогаю со студенческими работами здесь

Enum для QComboBox
Всем привет! Помогите, пожалуйста. Мне нужно сделать ComboBox с параметрами скорости COM порта....

QList<enum> приведение типов
Добрый день. Выручайте. Qt 5 под VS MyClass.h enum CuteEnum { Zero, One, Two,...

Перебор foreach для Enum
Привет. Как мне итерироваться? enum Fields { FIRST_FIELD, ...

enum - объявление перечисления в пространстве имен
Вечер добрый. Столкнулся с такой вот проблемой... На ночь глядя... Модуль_1.h namespace Visit...

Пользовательский виджет, плагин, свойство enum
Создал плагин для своего виджета для Qt Designer. В результате в редакторе свойств отобразились...

Qml enum
Здравствуйте, есть ли в Qml нечто вроде enum? Обнаружил только вот это свойство: Item { ...


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

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