QDateTimeEditor.setDateTime() |
Здравствуйте, гость ( Вход | Регистрация )
QDateTimeEditor.setDateTime() |
phlegmatik |
7.4.2012, 14:40
Сообщение
#1
|
Новичок Группа: Новичок Сообщений: 4 Регистрация: 7.4.2012 Пользователь №: 3312 Спасибо сказали: 0 раз(а) Репутация: 0 |
Доброго времени суток!
Сразу прошу прощения, если мой вопрос глупый, я только начал знакомиться с QT. Проблема моя в следующем. Я создал формочку, на которой есть два виджета QDateTimeEditor, с помощью которых пользователь может задавать промежуток времени (с помощью первого виджета задаётся начало, с помощью второго - конец этого промежутка). Для того, чтобы не допустить ситуации, когда время конца меньше времени начала и наоборот я определил слоты, вот один из них:
Вот код слота:
В результате после вызова fromTimeEditor->setDateTime(_fromTime); я снова попадаю в этот слот и выводится два сообщения "Выбран некорректный промежуток времени". Подскажите, пожалуйста, чайнику, как побороть данную проблему. Заранее спасибо ответившим. З.Ы.: прошу не обращать внимания на то, что не используеся _tr() я пока не разбирался с механизмом перевода интерфейса. |
|
|
Гость_Гость_* |
7.4.2012, 22:27
Сообщение
#2
|
Гости |
Самый простой вариант это сделать один слот, который будет вызыватся при изменении даты в любом из QDateTimeEditor'ов и там уже выполнять проверку:
|
|
|
phlegmatik |
8.4.2012, 19:47
Сообщение
#3
|
Новичок Группа: Новичок Сообщений: 4 Регистрация: 7.4.2012 Пользователь №: 3312 Спасибо сказали: 0 раз(а) Репутация: 0 |
Наверное, я неясно сформулировал сам вопрос.
Даже если сделать один слот для валидации временного промежутка и в нём вызывать setDateTime() для корректировки промежутка для какого-либо из QDateTimeEditor'ов, это приводит к следующему: 1. Попадаем в слот, в параметре получаем дату-время, которые тыкнул пользователь (некоректные), вызываем setDateTime() с корректным значением даты-времени. 2. Попадаем в слот, в параметре получаем дату-время, которые сами устанавливали в setDateTime(). 3. Повторяется п.1. 4. Повторяется п.2. Я не могу понять, почему выполняются пункты 3-4. И как ругнуться на пользователя и откорректировать значения даты-времени, не делая этого по два раза |
|
|
Гость_Гость_* |
8.4.2012, 20:48
Сообщение
#4
|
Гости |
Если речь о том, что 2 раза приходит значение от пользователя, то проблемма в том что сигнал от редактора соединен со слотом дважды.
|
|
|
Алексей1153 |
9.4.2012, 5:56
Сообщение
#5
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
если дело только в повторном соединении слота, то нужно просто сделать коннект с флагом Qt::UniqueConnection. Но лучше всё же разобраться, почему там два подключения происходит
иначе, бывает такое, что по некоторым неизбежным вызов сигнал-слот рекурсивно "зацикливается" , тогда нужно ввести в класс флаг bool , который проверяется взводится в начале слота - если взведён, выходим, если сброшен - взводим и выполняем слот, по выходу - сбрасываем |
|
|
phlegmatik |
9.4.2012, 5:56
Сообщение
#6
|
Новичок Группа: Новичок Сообщений: 4 Регистрация: 7.4.2012 Пользователь №: 3312 Спасибо сказали: 0 раз(а) Репутация: 0 |
Если речь о том, что 2 раза приходит значение от пользователя, то проблемма в том что сигнал от редактора соединен со слотом дважды. Похоже, дело не в этом. Если не вызывать в слоте setDateTime(), то слот вызывается ровно 1 раз. Если же в слоте добавить корректировку даты-времени через setDateTime(), то получается ситуация, которую я описал выше. |
|
|
Алексей1153 |
9.4.2012, 6:02
Сообщение
#7
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
phlegmatik, phlegmatik,
Если не вызывать в слоте setDateTime(), то слот вызывается ровно 1 раз. Если же в слоте добавить корректировку даты-времени через setDateTime(), то получается ситуация, которую я описал выше. это и есть зацикливание, то есть второй вариант из моего сообщения вместо флага можно выполнить проверку if(newTime!=oldTime) { setDataTime(newTime); } |
|
|
Гость_Гость_* |
9.4.2012, 9:07
Сообщение
#8
|
Гости |
Значит 1 раз когда приходит сигнал, ты устанавливаешь дату, которая тоже не проходит проверку. Посмотри под отладчиком, если QtCreator используешь, то там можно посмотреть свойства любого QOBject.
|
|
|
phlegmatik |
9.4.2012, 11:47
Сообщение
#9
|
Новичок Группа: Новичок Сообщений: 4 Регистрация: 7.4.2012 Пользователь №: 3312 Спасибо сказали: 0 раз(а) Репутация: 0 |
Большое спасибо ответившим!
Дело было в зацикливании, проблема решилась введением проверки времени перед вызовом setDateTime(). |
|
|
Текстовая версия | Сейчас: 5.12.2024, 14:54 |