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

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

  • автор:

Как получать данные со строки вместе с данными dateEdit?

Имеется код, который выводит данные со строки со всех столбцов, кроме тех в которых есть dataEdit , как это исправить? main.py:

import sys from PyQt5.QtWidgets import QApplication from PyQt5.QtWidgets import QWidget, QLabel from PyQt5 import uic from PyQt5.QtWidgets import QMainWindow from PyQt5 import QtCore, QtWidgets from PyQt5.Qt import * class Widget(QMainWindow): def __init__(self): super().__init__() uic.loadUi("UI_lke2.1.ui", self) # Добавить/удалить строку в tableWidget_2 self.pushButton_7.clicked.connect(self.buttonAdd) self.pushButton_8.clicked.connect(self.buttonDelete) # Добавить/удалить строку в tableWidget_3 self.pushButton_9.clicked.connect(self.buttonAdd_2) self.pushButton_10.clicked.connect(self.buttonDelete_2) # Сохранить данные из таблицы tableWidget_3 self.pushButton.clicked.connect(self.buttonSave) for row in range(self.tableWidget_3.rowCount()): date_from = QtWidgets.QDateTimeEdit() date_from.setDateTime( QtCore.QDateTime(QtCore.QDate(2021, 8, 26), QtCore.QTime(15, 0, 0)) ) self.tableWidget_3.setCellWidget(row, 0, date_from) for row in range(self.tableWidget_3.rowCount()): date_from = QDateTimeEdit() date_from.setDateTime( QDateTime(QDate(2021, 9, 2)) ) date_from.dateTimeChanged.connect( lambda dateTime, row=row: self.date_changed(dateTime, row)) self.tableWidget_3.setCellWidget(row, 0, date_from) self.dateTime0 = self.tableWidget_3.cellWidget(0, 0).dateTime() # Расчет времени от начального значения def date_changed(self, dateTime, row): if row == 0: self.dateTime0 = self.tableWidget_3.cellWidget(row, 0).dateTime() for row in range(1, self.tableWidget_3.rowCount()): dateTime2 = self.tableWidget_3.cellWidget(row, 0).dateTime() item = QTableWidgetItem() item.setData(Qt.DisplayRole, self.dateTime0.secsTo(dateTime2) / 60. / 60.) self.tableWidget_3.setItem(row, 1, item) return dateTime2 = self.tableWidget_3.cellWidget(row, 0).dateTime() item = QTableWidgetItem() item.setData(Qt.DisplayRole, self.dateTime0.secsTo(dateTime2) / 60. / 60.) self.tableWidget_3.setItem(row, 1, item) # Кнопка дабовляющая строку в таблицу tableWidget_2 def buttonAdd(self): rowPosition = self.tableWidget_2.rowCount() self.tableWidget_2.insertRow(rowPosition) # Кнопка удаляющая строку в таблицу tableWidget_2 def buttonDelete(self): if self.tableWidget_2.rowCount() > 0: self.tableWidget_2.removeRow(self.tableWidget_2.rowCount()-1) # Кнопка дабовляющая строку в таблицу tableWidget_3 def buttonAdd_2(self): rowPosition = self.tableWidget_3.rowCount() self.tableWidget_3.insertRow(rowPosition) date_from = QtWidgets.QDateTimeEdit() dateTime = QtCore.QDateTime().currentDateTime() date_from.setDateTime(dateTime) date_from.dateTimeChanged.connect( lambda dateTime, row=rowPosition: self.date_changed(dateTime, row)) self.tableWidget_3.setCellWidget(rowPosition, 0, date_from) # Кнопка удаляющая строку в таблицу tableWidget_3 def buttonDelete_2(self): if self.tableWidget_3.rowCount() > 0: self.tableWidget_3.removeRow(self.tableWidget_2.rowCount() - 1) # Сохранение данных из tableWidget_3 def buttonSave(self): rows = self.tableWidget_3.rowCount() cols = self.tableWidget_3.columnCount() data = [] for row in range(rows): tmp = [] for col in range(cols): try: tmp.append(self.tableWidget_3.item(row, col).text()) except: tmp.append('No data') data.append(tmp) data_for_word = [] for i in data: print(i) for i in data: if i[0] != 'No data': data_for_word.append(i) if __name__ == '__main__': app = QApplication(sys.argv) ex = Widget() ex.show() sys.exit(app.exec_()) 

Пример .ui :

  MainWindow   0 0 640 480   MainWindow        Удалить      Добавить         New Row    1    2    3    4    5    6    7    8    9       Считать данные        0 0 640 21       

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

Пример заполнения окна: Хочу получить данные по столбцам но, с данными из dataEdit(на скриншоте видно в первой строчке в первом столбце данных нет, а там dataEdit).

Отслеживать

74k 113 113 золотых знаков 38 38 серебряных знаков 55 55 бронзовых знаков

Получение значения виджета QDateTimeEdit

Author24 — интернет-сервис помощи студентам

В моей программе, пользователь вводит дату и время в виджет QDateTimeEdit после чего, значение из этого виджета должно добавится в базу данных SQLite. С помощью какого метода можно это сделать? В смысле: получить значение виджета QDateTimeEdit.

(Создавал виджет с помощью QtDesigner)

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Чтение URL адресса из окна виджета и открытие его браузером при нажатии кнопки виджета
#Как считать url со строки ввода в виджете что бы потом при нажатии кнопки виджета открыть этот.

Как навести мышку на x,y внутри виджета относительно 0,0 виджета (левого верхнего угла виджета)?
Как навести мышку на x,y внутри виджета относительно 0,0 этого виджета (левого верхнего угла.

Получение ответа от виджета youtube
Всем привет, использую на сайте код сгенерированный с официальной страницы гугл виджет youtube для.

Получение данных с локального сервера для виджета Windows
Добрый день/ Накидал небольшой виджет по образу и подобию, подскажите как создать подключение к.

Как записать в переменную данные из QDateTimeEdit?
Помогите, пожалуйста,есть QDateTimeEdit, пользователь ввёл в него время и дату, и мне нужно.

Эксперт Python

2685 / 1591 / 513
Регистрация: 21.02.2017
Сообщений: 4,209
Записей в блоге: 1

Лучший ответ

Сообщение было отмечено StudentOfChrist как решение

Решение

StudentOfChrist, Ты не поверишь: QDateTimeEdit.dateTime(), а чтобы перевести этот полученный объект в строку, есть классный способ toString().

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

Вызов виджета из значения переменной
Возможно ли вызвать виджет используя значение переменной string (смотрите пример) У меня виджеты.

Изменение значения виджета из другого потока
Доброго времени суток. Продолжаю серию нубовских вопросов. Есть основной поток с окошком.

2 xml-файла для виджета — Перерисовать окно виджета по нажатию
Нужно перерисовать окно виджета по нажатию. Причём, в обновлённом окне нужно использовать другой.

Как добраться до виджета, который находится внутри другого виджета?
Есть QStackWidget, внутри которого на одной из страниц-виджетов находится QTabWidget.

Почему заголовок виджета показывается ниже чем текст виджета
Создал зону виджетов. Создал шорткод. Шорткод вставляю в текстовый виджет. Заголовок виджета.

Или воспользуйтесь поиском по форуму:

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() .

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

Просмотр профиля

15.8.2009, 23:53

Группа: Новичок
Сообщений: 6
Регистрация: 15.8.2009
Пользователь №: 1003

Репутация: 0

Доброго всем времени суток.

У меня возникла следующая проблема:
необходимо реализовать возможность отображение в виджете QDateEdit нулевой даты ,
т.е той для которой верно QDate().isNull();

Первым и естественным на мой взгляд решением было создать потомка который будет переопределять функции QString textFromDateTime
( const QDateTime & dateTime ) const;
и void setDate(const QDate & date);

В textFromDateTime добавить проверку даты на нулевое значение и при положительной проверке возвращать заданный текст заместо вызова конвертирования значения даты в текст определенного в потомке.
В setDate так же сделать проверку на нулевое значение и при положительном результате изменять свойство обьекта напрямую без каких либо проверок.Так как определенная по умолчанию функция
делает проверку на нулевое значение и если проверка положительна устанавливает дату в значение свойства minimumDate.

Но тут и начались сложности.
Например код :

qDebug()qDebug()qDebug()qDebug()

приводит к довольно любопытному выводу :
DATE VALUE
QDate("")
DATE PROP
QVariant(QDate, QDate("Сб янв 1 2000") )
DATE SET
true
DATE PROP
QVariant(QDate, QDate("Сб янв 1 2000") )

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

Если кто нибудь знает как можно переключить функцию изменяющую свойство обьекта на другую
или хотя бы как решить данную задачу другим способом просьба поделиться

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

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