Как передать строку в qdatetimeedit
Перейти к содержимому

Как передать строку в qdatetimeedit

Programming / C++Programming / Qt / Qt-doc.ru / Дата и время в Qt

Работа с датой и временем в Qt осуществляется с помощью классов QDate , QTime и QDateTime , которые предназначены для хранения дат и времени и проведения с ними различных операций. Чаще всего требуется получение текущей даты и времени. Эти классы предоставляют методы для преобразования даты и времени в строку определенного формата. Также есть методы для проведения обратного преобразования — из строки. Таймер уведомляет приложение об истечении заданного промежутка времени. События таймера относятся к разряду внешних прерываний. Внешние прерывания — это прерывания, вызываемые асинхронными событиями, например, устройствами ввода/вывода или самим устройством таймера. Интервалы запуска таймера устанавливаются в миллисекундах. Недостаток состоит в том, что если программа занята интенсивными вычислениями, то события таймера могут быть обработаны по окончании процесса вычисления. При выходе из приложения таймеры автоматически уничтожаются. Приложениям часто требуется информация о дате и времени. Например, для выдачи отчетной информации или для реализации часов. Qt предоставляет для работы с датой и временем три класса: QDate , QTime и QDateTime , определенные в заголовочных файлах QDate , QTime и QDateTime . Класс QDate представляет собой структуру данных для хранения дат и проведения с ними разного рода операций. В конструкторе класса QDate передаются три целочисленных параметра. В первом передается год, во втором — месяц, а в третьем — день. Например, создадим объект, который будет содержать дату 25 октября 2004: QDate date(2007, 10, 25); Эти значения можно установить и после создания объекта с помощью метода setDate() . Например: QDate date; date.setDate(2007, 10, 25); Для получения значений года, месяца и дня, установленных в объекте даты, следует воспользоваться следующими методами: year() — возвращает целый год в диапазоне от 1752 до 8000; month() — возвращает целое значение месяца в диапазоне от 1 до 12 (с января по декабрь); day() — возвращает день месяца в диапазоне от 1 до 31. С помощью метода daysInMonth() можно узнать количество дней в месяце, а с помощью метода daysInYear () — количество дней в году. Для получения дня недели следует вызвать метод dayOfWeek() . Для получения дня года служит метод dayOfYear() . Можно также узнать номер недели, для чего нужно вызвать метод weekNumber() . Метод toString() позволяет получить текстовое представление даты. Можно определить собственный формат времени, передав в метод toString() строку-шаблон, описывающую его. Например:

QDate date(2007, 10, 25); QString str; str = date.toString( «d.M.yy» ); //str — «3.7.07» str = date.toString( «dd/MM/yy» ); //str — «03/07/04» str = date.toString( «yyyy.MMM.ddd» ) ; //str = «2007.июл.Сб» str = date.toString( «yyyy.MMMM.dddd» );//str = «2007.Июль.суббота» При помощи метода addDays() можно получить измененную дату, добавив или отняв от нее дни. Действия методов addMonths() и addYears() аналогичны, но разница в том, что они оперируют месяцами и годами. Например: QDate date(2007, 1, 3); QDate date2 = date.addDays(-7); QString str = date2.toString( «dd/MM/yy» ); //str = «27/12/06» Класс QDate предоставляет метод fromString() , позволяющий проводить обратное преобразование из строкового типа к типу QDate . Для этого, в первом параметре метода нужно передать формат. Одна из самых частых операций — получение текущей даты. Для этого нужно вызвать метод currentDate() . При помощи метода daysTo() можно узнать разницу в днях между двумя датами. Следующий пример определяет количество дней от текущей даты до Нового года: QDate dateToday = QDate::currentDate(); QDate dateNewYear(dateToday.year(), 12, 31); qDebug() << "Осталось " << dateToday.daysTo(dateNewYear) << " дней до Нового года" ; Объекты дат можно сравнивать друг с другом, для чего в классе QDate определены операторы ==, !=, и >=. Например: QDate datel(2007, 1, 3); QDate date2(2007, 1, 5); bool b = (datel == date2); //b = false Контроль над временем — очень важная задача, с помощью которой можно вычислять задержки в работе программы, отображать на экране текущее время, проверять время создания файлов и т. д. Для работы со временем библиотека Qt предоставляет класс QTime . Как и в случае с объектами даты, с объектами времени можно проводить операции сравнения ==, !=, или >=. Объекты времени способны хранить время с точностью до миллисекунд. В конструктор класса QTime передаются четыре параметра. Первый параметр задает часы, второй — минуты, третий — секунды, а четвертый —

миллисекунды. Третий и четвертый параметры можно опустить, по умолчанию они равны нулю. Например: QTime time(20, 4); Эти значения можно устанавливать и после создания объекта времени с помощью метода setHMS() . Например: QTime time; time.setHMS (20, 4, 23, 3); Для получения значений часов, минут, секунд и миллисекунд, установленных в объекте времени, в классе QTime определены следующие методы: hour() — возвращает положительные значения часа в диапазоне от 0 до 23; minute() — возвращает целое значение, обозначающее минуты, в диапазоне от 0 до 59; second() — возвращает целое значение, обозначающее секунды, в диапазоне от 0 до 59; msec() — возвращает целое значение в диапазоне от 0 до 999, представляющее собой миллисекунды. Класс QTime предоставляет метод toString() для передачи данных объекта времени в виде строки. В этот метод, в качестве параметра, можно передать одно из форматов времени или задать свой собственный. Например: QTime time(20, 4, 23, 3); QString str; str = time.toString( «hh:mm:ss.zzz» ); //str = «20:04:23.003» str = time.toString( «h:m:s ap» ); //str = «8:4:23 pm» При помощи статического метода fromString() можно произвести преобразование из строкового типа в тип QTime . Для этого, в первом параметре метода нужно передать одно из значений форматов. Получить измененный объект времени можно, добавив или отняв значения секунд (или миллисекунд) от существующего объекта. Эти значения передаются в методы addSecs() и addMSecs() . Для получения текущего времени в классе QTime содержится статический метод currentTime (). При помощи метода start() можно начать отсчет времени, а для того чтобы узнать сколько времени прошло с момента начала отсчета, следует вызвать метод elapsed(). Например, на базе этих методов можно сделать небольшой профайлер. Следующий пример вычисляет время работы функции test() : QTime time; time.start () ;

Данный подход обладает другим недостатком — он не асинхронен. То есть, наша программа будет в состоянии обрабатывать поступающие события, но не в состоянии исполняться дальше, пока цикл не завершится до конца. Таймер представляет собой решение этой проблемы. События таймера происходят асинхронно и не прерывают обработку других событий, выполняемых в том же потоке. Таймер — это гарант, обеспечивающий передачу управления программе. Долгая обработка событий влечет за собой задержки выполнения события таймера, то есть таймер ждет своего времени, как и остальные события. Период между событиями таймера носит название интервал запуска (firing interval). Таймер переходит в сигнальное состояние по истечении интервала запуска, который указывается в миллисекундах. Точность интервала запуска ограничивается, к сожалению, точностью системных часов, а это значит, что на таймер нельзя полагаться как на секундомер. ОС Windows 98 отличается самой плохой точностью — она составляет 55 миллисекунд, во всех же остальных ОС, поддерживаемых Qt, точность лежит в пределах одной миллисекунды. Следовательно, при написании программы имитации часов будет нелишним, после каждого сообщения таймера, проверять текущее время. Так как временной интервал, задаваемый в таймере, представляет собой целое число, то самый большой временной интервал, который можно установить — 24 дня. Эту проблему можно решить введением дополнительного счетчика для таймера. Существует много областей для применения таймера. Например, в текстовом редакторе его используют для автоматического сохранения файлов или в качестве альтернативы многопоточности, разбив программу на части, каждая из которых будет выполняться при наступлении события таймера. Также таймер используется для отображения информации о состоянии данных, изменяющихся с течением времени. Таймер незаменим для избежания разногласий, связанных с мощностью и возможностями разных компьютеров, то есть для исполнения программ в режиме реального времени. События таймера можно использовать и в мультипоточном программировании, для каждого потока, имеющего цикл сообщений (event loop). Для запуска цикла сообщений в потоке нужно вызвать метод QThread::exec() . Каждый класс, унаследованный от QObject , содержит свои собственные встроенные таймеры. Вызов метода QObject::startTimer() производит запуск таймера. В качестве параметра ему передается интервал запуска в миллисекундах. Метод startTimer() возвращает идентификатор, необходимый для распознавания таймеров, используемых в объекте. По истечении установленного интервала запуска генерируется событие QTimerEvent , которое передается В метод timerEvent() . Вызвав метод QTimerEvent::timerId() объекта события QTimerEvent , можно узнать идентификатор таймера, инициировавшего это событие. Идентификатор можно использовать для уничтожения таймера, передав его в метод QObject::killTimer() . В следующей программе отображается надпись, которая появляется и исчезает через заданные промежутки времени. <рисунок>int main ( int argc, char ** argv)

QApplication app (argc, argv);
BlinkLabel lbl( »

COLOR = RED>
Blink
» );

lbl.show(); return app.exec(); > В функции main() создается виджет класса BlinkLabel , в конструктор которого первым параметром передается отображаемый текст в формате RichText . class BlinkLabel : public QLabel < private : bool m_bBlink; QString m_strText; protected : virtual void timerEvent(QTimerEvent*) < m_bBlink = !m_bBlink; setText(m_bBlink ? m_strText : "" );

>
public :
BlinkLabel( const QString& strText,
int nInterval = 200,
QWidget* pwgt = 0
)

: QLabel(strText, pwgt) , m_bBlink( true ) , m_strText(strText) < startTimer(nInterval); >>; Класс BlinkLabel содержит атрибут булевого типа m_bBlink , управляющий отображением надписи, и атрибут m_strText , содержащий текст надписи. В конструктор класса BlinkLabel передается интервал мигания nInterval . По умолчанию он равен 200 миллисекундам. Вызов метода startTimer() запускает таймер со значением переданного интервала запуска. По истечении этого интервала происходит создание события QTimerEvent , которое передается в

метод timerEvent() , в котором происходит смена значения атрибута m_bBlink на противоположное. И в соответствии с установленным значением, методом setText() выполняется одно из действий: false — вся область надписи очищается установкой пустой строки; true — текст надписи устанавливается заново. Использование объекта класса QTimer гораздо проще, чем использование события таймера, определенного в классе QObject . К недостаткам работы с событием таймера относится необходимость наследования одного из классов наследующих QObject . Затем, в унаследованном классе нужно реализовать метод, принимающий объекты события таймера. А если в объекте создается более одного таймера, то возникает необходимость различать таймеры, чтобы узнать, который из них явился инициатором события. Для ликвидации этих неудобств Qt предоставляет класс таймера QTimer , являющийся непосредственным наследником класса QObject . Чтобы запустить таймер, нужно создать объект класса QTimer , а затем вызвать метод start() . В параметре метода передается значение интервала запуска в миллисекундах. Класс QTimer содержит статический метод singleshot() для одноразового режима отработки таймера ( singleshot ). С его помощью можно запустить одноразовый таймер без создания объекта класса QTimer . Первый параметр метода задает интервал запуска, а второй — является указателем на объект, с которым должно осуществляться соединение. Слот для соединения передается в третьем параметре. Этим можно воспользоваться, например, для прекращения работы демо-версии программы через 5 минут после ее запуска. int main( int argc, char ** argv) < QApplication app(argc, argv); MyProgram myProgram; QTimer::singleShot(5 * 60 * 1000, &app, SLOT (quit())); myProgram.show(); return app.exec(); >По истечении интервала запуска таймера высылается сигнал timeout() , который нужно соединить со слотом, выполняющим нужные действия. При помощи метода setInterval() можно изменить интервал запуска таймера. В том случае, если таймер был активен, он будет остановлен и запущен с новым интервалом, и ему будет присвоен новый идентификационный номер. При помощи метода isActive() можно проверить, находится таймер в активном состоянии. Вызовом метода stop() можно остановить таймер. Программа, окно которой изображено на рисунке, реализует часы, отображающие дату и время. Отображаемая информация актуализируется в соответствии с установленным полусекундным интервалом запуска таймера.

#include class Clock : public QLabel < Q_OBJECT public : Clock(QWidget* pwgt = 0) : QLabel(pwgt) < QTimer* ptimer = new QTimer( this ); connect(ptimer, SIGNAL (timeout()), SLOT (slotUpdateDateTime())); ptimer->start(500); slotUpdateDateTime(); > public slots: void slotUpdateDateTime() < QString str = QDateTime::currentDateTime().toString(Qt::SystemLocaleDate); setText( "

» + str + «

» ); > >; #endif //_Clock_h_ В конструкторе класса Clock создается объект таймера (указатель ptimer). Его сигнал timeout() соединяется со слотом, ответственным за обновление Отображаемой информации slotUpdateDateTime() . Вызов метода start() запускает таймер. В него передается интервал запуска. Слот slotUpdateDateTime() получает актуальную дату и время с помощью метода currentDateTime() . Затем он, с параметром локализации Qt::SystemLocaleDate преобразовывает дату и время к строковому типу и передает, для отображения, в метод setText() . В качестве альтернативы, в Qt предусмотрено минималистическое решение для таймера — это класс QBasicTimer , пред оставляющий только четыре метода: isActive(), start(), stop(), timerId(). Данные методы по своей функциональности, аналогичны методам класса QTimer . Исключение составляет только метод start() . Помимо первого параметра,

задающего интервал, в этот метод, вторым параметром, передается указатель на объект QObject , который будет получать события таймера. То есть, вам нужно будет реализовать в классе, унаследованном от QObject , метод обработки события таймера QObject::timerEvent() .

Можно ли поменять дату\время в QTimeEdit?

6060839a0e95a233472776.jpeg

Хочу поменять дату и время в своих часах. Как будто реально меняю время на часах. На данный момент показывает реальное время, как его можно поменять?
Можно ли это сделать с QDateTimeEdit?

Закройте глаза на тавтологию)

  • Вопрос задан более двух лет назад
  • 395 просмотров

Как передать строку в qdatetimeedit

На этом шаге рассмотрим переопределение специализированных методов обработки событий.

Приложениям часто требуется информация о дате и времени, например, для выдачи отчетной информации или для реализации часов. Qt предоставляет для работы с датой и временем три класса: QDate, QTime и QDateTime, определенных в заголовочных файлах QDate, QTime и QDateTime.

Класс QDate представляет собой структуру данных для хранения дат и проведения с ними разного рода операций. В конструктор класса QDate передаются три целочисленных параметра. Первым передается год, вторым — месяц, а третьим — день. Например, создадим объект, который будет содержать дату 8 марта 2015 года:

QDate date(2015, 3, 8);

Эти значения с помощью метода setDate() можно установить и после создания объекта. Например:

QDate date; date.setDate(2015, 3, 8);

Для получения значений года, месяца и дня, установленных в объекте даты, следует воспользоваться следующими методами:

  • year() — возвращает год в диапазоне от 1752 до 8000;
  • month() — возвращает целое значение месяца в диапазоне от 1 до 12 (с января по декабрь);
  • day() — возвращает день месяца в диапазоне от 1 до 31.

С помощью метода daysInMonth() можно узнать количество дней в месяце, а с помощью метода daysInYear() — количество дней в году.

Для получения дня недели следует вызвать метод dayOfWeek(). Для получения порядкового номера дня в году служит метод dayOfYear(). Можно также узнать номер недели, для чего нужно вызвать метод weekNumber().

Метод toString() позволяет получить текстовое представление даты, а в качестве параметра можно передать одно из значений, указанных в табл. 1.

Таблица 1. Перечисления DateFormat пространства имен Qt
Константа Значение Описание
TextDate 0x0000 Специальный формат Qt (определен по умолчанию)
ISODate 0x0001 Расширенный формат ISO 8601 (YYYY-MM-DD)
SystemLocaleDate 0x0002 Формат, зависящий от установленного в операционной систе-ме языка страны
LocaleDate 0x0003 Формат, использующий локализацию приложения, которая устанавливается вызовом метода QLocale::setDefault(). Если он не установлен, то используется формат SystemLocaleDate

Если в таблице не приведен нужный вам формат, то можно определить свой собственный, передав в метод toString() строку-шаблон, описывающую его. Например:

QDate date(2015, 3, 8); QString str; str = date.toString("d.M.yy"); str = date.toString("dd/MM/yy"); str = date.toString("yyyy.MMM.ddd"); str = date.toString("yyyy.MMMM.dddd");

Результат работы приложения приведен на рис. 1.

Рис.1. Примеры отображения даты

Файлы приложения можно взять здесь.

При помощи метода addDays() можно получить измененную дату, добавив или отняв от нее указанное количество дней. Действия методов addMonths() и addYears() аналогичны, но разница в том, что они оперируют месяцами и годами. Например:

QDate date(2015, 3, 8); QDate date2 = date.addDays(-15); QString str = date2.toString("dd/MM/yy");  

Результат работы приложения приведен на рис. 2.

Рис.2. Пример изменения даты

Файлы приложения можно взять здесь.

Класс QDate предоставляет статический метод fromString(), позволяющий проводить обратное преобразование из строкового типа к типу QDate. Для этого первым параметром метода нужно передать строку с датой, а вторым можно передать формат в виде флага из табл. 1 или строки.

Одна из самых частых операций — получение текущей даты. Для этого нужно вызвать статический метод currentDate(), возвращающий объект класса QDate.

При помощи метода daysTo() можно узнать разницу в днях между двумя датами. Следующий пример определяет количество дней от текущей даты до Нового года:

QDate dateToday = QDate::currentDate(); QDate dateNewYear(dateToday.year(), 12, 31); qDebug()  

Результат работы приложения приведен на рис. 3.


Рис.3. Пример расчета

Файлы приложения можно взять здесь.

Объекты дат можно сравнивать друг с другом, для чего в классе QDate определены операторы ==, !=, и >=. Например:

QDate date1(2015, 1, 3); QDate date2(2015, 1, 5); bool b = (date1 == date2);

Результат работы приложения приведен на рис. 4.

Рис.4. Пример сравнения

Файлы приложения можно взять здесь.

Контроль над временем очень важная задача, с помощью которой можно вычислять задержки в работе программы, отображать на экране текущее время, проверять время создания файлов и т. д.

Для работы со временем библиотека Qt предоставляет класс QTime. Как и в случае с объектами даты, с объектами времени можно проводить операции сравнения ==, !=, или >=.

Объекты времени способны хранить время с точностью до миллисекунд. В конструктор класса QTime передаются четыре параметра. Первый параметр задает часы, второй — минуты, третий — секунды, а четвертый — миллисекунды. Третий и четвертый параметры можно опустить, по умолчанию они равны нулю. Например:

QTime time(20, 4);

Эти значения можно устанавливать и после создания объекта времени посредством метода setHMS(). Например:

QTime time; time.setHMS (20, 4, 23, 3);

Для получения значений часов, минут, секунд и миллисекунд, установленных в объекте времени, в классе QTime определены следующие методы:

  • hour() — значение часа в диапазоне от 0 до 23;
  • minute() — минуты, в диапазоне от 0 до 59;
  • second() — секунды, в диапазоне от 0 до 59;
  • msec() — миллисекунды в диапазоне от 0 до 999.

Класс QTime предоставляет метод toString() для передачи данных объекта времени в виде строки. В этот метод, в качестве параметра, можно передать одно из значений, указанных в табл. 1, или задать свой собственный формат. Например:

QTime time(20, 4, 23, 3); QString str; str = time.toString("hh:mm:ss.zzz"); str = time.toString("h:m:s ap"); 

Результат работы приложения приведен на рис. 5.

Рис.5. Пример отображения времени

Файлы приложения можно взять здесь.

При помощи статического метода fromString() можно выполнить преобразование из строкового типа в тип QTime. Для этого первым параметром метода передается строка, представляющая время. Вторым параметром можно передать одно из значений форматов, приведенных в табл. 1, или строку с ожидаемым форматом.

Изменить объект времени можно, добавив или отняв значения секунд (или миллисекунд) от существующего объекта. Эти значения передаются в методы addSecs() и addMSecs(). Для получения текущего времени в классе QTime содержится статический метод currentTime().

При помощи метода start() можно начать отсчет времени, а для того чтобы узнать, сколько времени прошло с момента начала отсчета, следует вызвать метод elapsed(). Например, на базе этих методов можно сделать небольшой профайлер, т. е. инструмент, позволяющий оценить эффективность работы кода и выявить его узкие места для оптимизации. Следующий пример вычисляет время работы функции test():

QTime time; time.start(); test(); qDebug()  

Недостаток класса QTime состоит в ограничении 24-часовым интервалом, по истечении которого отсчет будет осуществляться с нуля. Для решения этой проблемы можно воспользоваться классом QDateTime.

Объекты класса QDateTime содержат в себе дату и время. Вызовом метода date() можно получить объект даты (QDate), а вызов time() возвращает объект времени (QTime). Этот класс также содержит методы toString() для представления данных в виде строки. Для этого можно воспользоваться одним из форматов, указанных в табл. 1, или собственной строкой с форматом.

На следующем шаге рассмотрим события перетаскивания.

Как изменить время в QDateTimeEdit

Имеется переменная date , которая имеет тип QDateTimeEdit . date.dateTime() имеет тип QDateTime . Как добавить или вычесть несколько дней или часов?

Отслеживать 73.3k 109 109 золотых знаков 38 38 серебряных знаков 55 55 бронзовых знаков задан 31 авг 2021 в 14:42 1,159 1 1 золотой знак 10 10 серебряных знаков 19 19 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию
import sys from PyQt5.Qt import * class MyWin(QWidget): def __init__(self): super().__init__() lblCurrentDateTime = QLabel() self.lblDateTimeEdit = QLabel() btn_days = QPushButton("DateTime + 7 days") btn_days.clicked.connect(self.editDateDay_days) btn_hours = QPushButton("DateTime + 2 hours") btn_hours.clicked.connect(self.editDateDay_hours) lblCurrentDateTime.setText( QDateTime.currentDateTime().toString('yyyy MM dd hh:mm:ss')) self.dateTimeBegin = QDateTimeEdit() self.dt = self.dateTimeBegin.dateTime().currentDateTime() lay = QVBoxLayout(self) lay.addWidget(lblCurrentDateTime) lay.addWidget(self.lblDateTimeEdit) lay.addWidget(btn_days) lay.addWidget(btn_hours) def editDateDay_days(self): self.dateTimeBegin.setDateTime(self.dt.addDays(7)) self.dt = self.dt.addDays(7) currentTime = self.dateTimeBegin.dateTime().toString( 'yyyy MM dd hh:mm:ss') self.lblDateTimeEdit.setText( self.dateTimeBegin.dateTime().toString('yyyy MM dd hh:mm:ss')) def editDateDay_hours(self): self.dateTimeBegin.setDateTime(self.dt.addSecs(1*60*60*2)) self.dt = self.dt.addSecs(1*60*60*2) currentTime = self.dateTimeBegin.dateTime().toString( 'yyyy MM dd hh:mm:ss') self.lblDateTimeEdit.setText( self.dateTimeBegin.dateTime().toString('yyyy MM dd hh:mm:ss')) if __name__ =="__main__": app = QApplication(sys.argv) w = MyWin() w.show() sys.exit(app.exec_()) 

введите сюда описание изображения

Отслеживать
ответ дан 31 авг 2021 в 15:22
73.3k 109 109 золотых знаков 38 38 серебряных знаков 55 55 бронзовых знаков
Спасибо большое! Помогло
1 сен 2021 в 6:49

@helldrg Если мой ответ помог вам, то не забудьте пометить как правильный, если вы не знаете, как это сделать, проверьте ru.stackoverflow.com/tour

1 сен 2021 в 7:07
в моем случае не помогло, расписал в UDP
1 сен 2021 в 7:10

@helldrg в вашем примере есть скрытая ошибка. Замените строку class MainWindow(QtWidgets.QMainWindow, Ui_Form): на строку class MainWindow(QtWidgets.QWidget, Ui_Form): , а также замените addDays на addSecs

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *