Russian Qt Forum
Ноябрь 01, 2024, 08:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: реализация таймера  (Прочитано 6989 раз)
Lora
Гость
« : Январь 17, 2014, 22:38 »

здравствуйте, я новенькая и сейчас пишу таймер на Qt
подскажите, пожалуйста, вот есть окошко, куда вводить через сколько времени прозвенит, т.е. минуты часы секунды. так вот. вбивая эти данные туда, компилятор потом должен из перевести в формат QtTime через метод fromString и потом я просто хотела перевести эти значения, что вбивает пользователь в милисекунды, но не знаю как. а потом только сравнить их с помощью метода elapsed( ), который как раз определяет, сколько прошло времени

подскажите, помогите, направьте в правильное русло(((
уже день думаю над этой задачкой, даже прогуглить толком нечего(
 код у меня наполовину есть, тот что в трёх файлах - h, cpp и main, но он представляет из себя обыкновенные часы с окошком для ввода времени таймера, так что ничего особого в нём нет
Записан
Lora
Гость
« Ответ #1 : Январь 17, 2014, 22:41 »

он какой то такой, корявый, но часы показывает.
чтоб вы не думали, что я совсем тупая и ничего не делала...)))



Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QtGui>

Timer::Timer (QWidget* p) : QWidget(p)
{
    plcd = new QLCDNumber;
    plcd->setSegmentStyle(QLCDNumber::Flat);
    plcd->setFrameStyle(0);
    plcd->setMinimumSize(150,70);

    isOn = false;
    QTimer* timer = new QTimer(this);
    connect (timer, SIGNAL(timeout()), this, SLOT(showTime()));
    timer->start(1000);


    lbl = new QLabel;
    lbl->setAlignment(Qt::AlignCenter);//выравнивание
    lbl->setMinimumSize(100, 25);



    TimeEdit = new QTimeEdit();

        QPushButton* timer_button = new QPushButton("Set Timer");
        QPushButton* stop_button = new QPushButton("STOP");
//    alarm_time.isNull();


    connect (timer_button, SIGNAL(clicked()), this, SLOT(setTimer()));
    //Timer
    p_timer = new QTimer(this);
    connect (p_timer, SIGNAL(timeout()), this, SLOT(getTimer()));
    p_timer->start(1000);

    getTimer();
    QTimeEdit *timeEdit = new QTimeEdit(p);
    timeEdit->setDisplayFormat("hh:mm");
    // Layout setup
    QVBoxLayout* pvbx = new QVBoxLayout;
    pvbx->addWidget(plcd);
    pvbx->addWidget(lbl);
    pvbx->addWidget(TimeEdit);
    pvbx->addWidget(timer_button);
    pvbx->addWidget(stop_button);
    pvbx->setSizeConstraint(QLayout::SetFixedSize);
    setLayout(pvbx);

    setWindowTitle (tr("TIMER"));

}
//Current Time
void Timer::showTime()
{
    QTime time = QTime::currentTime();
    QString text = time.toString("hh:mm");
    if ((time.second() % 2) == 0)
        text[2] = ' ';
    plcd->display(text);
}

void Timer::setTimer()
{

}

void Timer::getTimer()
{

}
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #2 : Январь 17, 2014, 23:21 »

Цитировать
т.е. минуты часы секунды. так вот. вбивая эти данные туда, компилятор потом должен из перевести в формат QtTime через метод fromString и потом я просто хотела перевести эти значения, что вбивает пользователь в милисекунды, но не знаю как.
Через QTime не получится. Просто вручную переведите часы, минуты и секунды в миллисекунды

Цитировать
а потом только сравнить их с помощью метода elapsed( ), который как раз определяет, сколько прошло времени
Зачем что-то сравнивать? Задаем QTimer'у установленный пользователем интервал (вы перевели его в миллисекунды) и ждем сигнала timeout().
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Alexu007
Гость
« Ответ #3 : Январь 19, 2014, 07:38 »

Зачем вообще милисекунды?

Есть таймер, который каждый определенный промежуток времени умеет сигнал эмитировать (не звуковой!). Вот в обработчике этого сигнала и вычитайте заранее установленное время вручную:

секунды - 1;
если (секунды == 0) секунды = 60; минуты - 1;
если (минуты  ==  0)  минуты = 60; часы - 1;

И тут же в этом обработчике цифры на экран выводите. Будет ваш таймер тикать, пока 00:00:00 на экране не нарисуется. А дальше - ВЗРЫВ!!! ВЗРЫВ!!! ВЗРЫВ!!! Пособие для начинающих террористок.

Как прикрутить в программу таймер - легко гуглится. Да, и ещё. Вы не старайтесь сразу всю программу целиком написать. Сперва таймер в программе запустите, пусть каждую секунду хоть цифры прибавляющиеся на экран выводит, что будет свидетельствовать о его работоспособности. Потом думать начнёте, как вместо цифр время на экран вывести. А когда и время затикает - можно докрутить окна ввода времени в таймер.

 



Записан
Lora
Гость
« Ответ #4 : Январь 19, 2014, 11:06 »

Зачем вообще милисекунды?

Есть таймер, который каждый определенный промежуток времени умеет сигнал эмитировать (не звуковой!). Вот в обработчике этого сигнала и вычитайте заранее установленное время вручную:

секунды - 1;
если (секунды == 0) секунды = 60; минуты - 1;
если (минуты  ==  0)  минуты = 60; часы - 1;

И тут же в этом обработчике цифры на экран выводите. Будет ваш таймер тикать, пока 00:00:00 на экране не нарисуется. А дальше - ВЗРЫВ!!! ВЗРЫВ!!! ВЗРЫВ!!! Пособие для начинающих террористок.

Как прикрутить в программу таймер - легко гуглится. Да, и ещё. Вы не старайтесь сразу всю программу целиком написать. Сперва таймер в программе запустите, пусть каждую секунду хоть цифры прибавляющиеся на экран выводит, что будет свидетельствовать о его работоспособности. Потом думать начнёте, как вместо цифр время на экран вывести. А когда и время затикает - можно докрутить окна ввода времени в таймер.


не подскажешь, что это за метод?Непонимающий?
Записан
Alexu007
Гость
« Ответ #5 : Январь 19, 2014, 11:58 »

Этот метод называется "вручную". Не всегда использовать готовые функции, а когда проще - написать свою реализацию.

Код
C++ (Qt)
#include "widget.h"
#include "ui_widget.h"
 
#include <QTime>
#include <QTimer>
 
 
QTimer* myTimer = new QTimer();
 
int hour, min, sec;
 
 
 
 
 
Widget::Widget(QWidget *parent) :
   QWidget(parent),
   ui(new Ui::Widget)
{
   ui->setupUi(this);
 
   ui->lcdNumber->setNumDigits(8);
 
 
   QObject::connect(ui->pushButton_1, SIGNAL(clicked()), this, SLOT(MyEventHandler1()));
   QObject::connect(myTimer, SIGNAL(timeout()), this, SLOT(MyEventHandler2()));
 
}
 
 
 
 
Widget::~Widget()
{
   delete ui;
}
 
 
 
 
 
// обработка нажатия кнопки Start
void Widget::MyEventHandler1()
{
   hour = 1;
   min = 15;
   sec = 0;
 
   myTimer->start(1000);
 
   return;
}
 
 
 
 
 
// обработка сигналов таймера
void Widget::MyEventHandler2()
{
 
   QString text = QTime(hour, min, sec).toString("hh:mm:ss");
 
   ui->label->setText(text);
 
   ui->lcdNumber->display(text);
 
 
   if(hour == 0 && min == 0 && sec == 0) myTimer->stop();
 
 
   sec--;
 
   if(sec < 0) {min--; sec = 59;}
   if(min < 0) {hour--; min = 59;}
 
 
return;
}


« Последнее редактирование: Январь 19, 2014, 12:00 от Alexu007 » Записан
Lora
Гость
« Ответ #6 : Январь 20, 2014, 01:36 »

Этот метод называется "вручную". Не всегда использовать готовые функции, а когда проще - написать свою реализацию.

Код
C++ (Qt)
#include "widget.h"
#include "ui_widget.h"
 
#include <QTime>
#include <QTimer>
 
 
QTimer* myTimer = new QTimer();
 
int hour, min, sec;
 
 
 
 
 
Widget::Widget(QWidget *parent) :
   QWidget(parent),
   ui(new Ui::Widget)
{
   ui->setupUi(this);
 
   ui->lcdNumber->setNumDigits(8);
 
 
   QObject::connect(ui->pushButton_1, SIGNAL(clicked()), this, SLOT(MyEventHandler1()));
   QObject::connect(myTimer, SIGNAL(timeout()), this, SLOT(MyEventHandler2()));
 
}
 
 
 
 
Widget::~Widget()
{
   delete ui;
}
 
 
 
 
 
// обработка нажатия кнопки Start
void Widget::MyEventHandler1()
{
   hour = 1;
   min = 15;
   sec = 0;
 
   myTimer->start(1000);
 
   return;
}
 
 
 
 
 
// обработка сигналов таймера
void Widget::MyEventHandler2()
{
 
   QString text = QTime(hour, min, sec).toString("hh:mm:ss");
 
   ui->label->setText(text);
 
   ui->lcdNumber->display(text);
 
 
   if(hour == 0 && min == 0 && sec == 0) myTimer->stop();
 
 
   sec--;
 
   if(sec < 0) {min--; sec = 59;}
   if(min < 0) {hour--; min = 59;}
 
 
return;
}





а если не используя ui, то код должен так примерно выглядеть?
Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"
int m,h,s,summ;
QTimer*pqtimer=new QTimer();
Mustang::Mustang(QWidget *pw):QWidget(pw)
{

isOn=false;
    time=new QTimeEdit();

    Starttimer=new QPushButton("START",this);
    connect(Starttimer,SIGNAL(clicked()),this,SLOT(setTime()));
    //обновляе таймер

//    соединяем его с функцией
    connect(pqtimer,SIGNAL(timeout()),this,SLOT(getTime));
;
    box=new QVBoxLayout;
    box->addWidget(time);
    box->addWidget(Starttimer);
    setLayout(box);
    setWindowTitle (tr("TIMERR"));
}
void Mustang::setTime()
{
    isOn=true;
    qtime = time->time();
 h=(qtime.hour())/**3600000*/;
 m=(qtime.minute())/**60000*/;
 s=(qtime.second())/**1000*/;


    pqtimer->start(1000);


QMessageBox* message = new QMessageBox
(QMessageBox::Information, "TIMER","Your time thas been set.",QMessageBox::Ok);

message->show();
message->setAttribute(Qt::WA_DeleteOnClose,true);
}

void Mustang::getTime()
{


if(h==0&&m==0&&s==0)pqtimer->stop();

    QMessageBox* message = new QMessageBox
    (QMessageBox::Information, "TIMER","TIME HAS OVER",QMessageBox::Ok);

    message->show();
    message->setAttribute(Qt::WA_DeleteOnClose,true);

s--;
if(s<0){m--;s=59;}
if(m<0){h--;m=59;}

}
а то до ui я ещё не дошла и программа не совсем верно компилируется, что скинул, но это скорее потому, что я как то не правильно её вставляю.
 а в том коде, что без ui не выскакивает окошко с надписью, что  время вышло(
только эта ошибка пишется :
Object::connect: Parentheses expected, slot Mustang::getTime in mainwindow.cpp:16
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Январь 20, 2014, 10:35 »

Код
C++ (Qt)
   message->show();
   message->setAttribute(Qt::WA_DeleteOnClose,true);
 
Пока используются готовые классы - все вроде ничего..
Код
C++ (Qt)
s--;
if(s<0){m--;s=59;}
if(m<0){h--;m=59;}
 
Оба-на! Грибочки. Возможно Вам лучше отложить Qt и заняться изучением языка. Научиться давать переменным имена, выделять ф-ции/методы и просто нормально писать текст. А Qt никуда не убежит.
Записан
Figaro
Гость
« Ответ #8 : Январь 21, 2014, 13:15 »

Я бы добавил, ТС надо еще внимательно прочитать "Орфографический словарь русского языка"
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.129 секунд. Запросов: 23.