crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> QDateTimeEditor.setDateTime()
phlegmatik
  опции профиля:
сообщение 7.4.2012, 14:40
Сообщение #1


Новичок


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

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

Сразу прошу прощения, если мой вопрос глупый, я только начал знакомиться с QT.
Проблема моя в следующем. Я создал формочку, на которой есть два виджета QDateTimeEditor, с помощью которых пользователь может задавать промежуток времени (с помощью первого виджета задаётся начало, с помощью второго - конец этого промежутка). Для того, чтобы не допустить ситуации, когда время конца меньше времени начала и наоборот я определил слоты, вот один из них:
connect(fromTimeEditor, SIGNAL(dateTimeChanged(const QDateTime &)), this, SLOT(CorrectFromDateTime(const QDateTime &)));


Вот код слота:
void DetailInfoDialog::CorrectFromDateTime(const QDateTime& time)
{
    if(_toTime < time)
    {
        QMessageBox msg;
        msg.setText("Выбран некорректный промежуток времени");
        msg.exec();
        _fromTime = _toTime;
    }
    else
        _fromTime = time;
    fromTimeEditor->setDateTime(_fromTime);
}


В результате после вызова fromTimeEditor->setDateTime(_fromTime); я снова попадаю в этот слот и выводится два сообщения "Выбран некорректный промежуток времени".
Подскажите, пожалуйста, чайнику, как побороть данную проблему. Заранее спасибо ответившим.
З.Ы.: прошу не обращать внимания на то, что не используеся _tr() я пока не разбирался с механизмом перевода интерфейса.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 7.4.2012, 22:27
Сообщение #2





Гости








    


Самый простой вариант это сделать один слот, который будет вызыватся при изменении даты в любом из QDateTimeEditor'ов и там уже выполнять проверку:
// Пусть где то обьявленно:
// QDateTimeEditor * dtBegin;
// QDateTimeEditor * dtEnd;
//........................................
//где то в коде, например в конструкторе
connect(dtBegin,SIGNAL(dateTimeChanged(const QDateTime &)), this, SLOT(CorrectFromDateTime());
connect(dtEnd,SIGNAL(dateTimeChanged(const QDateTime &)), this, SLOT(CorrectFromDateTime());
//........................................
void MyForm::CorrectFromDateTime()
{
  if(dtEnd->dateTime()>dtBegin->dateTime())
  {
     //обработка ошибки
  }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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. И как ругнуться на пользователя и откорректировать значения даты-времени, не делая этого по два раза :unknw:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 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  


Цитата(Гость @ 8.4.2012, 21:48) *
Если речь о том, что 2 раза приходит значение от пользователя, то проблемма в том что сигнал от редактора соединен со слотом дважды.


Похоже, дело не в этом. Если не вызывать в слоте setDateTime(), то слот вызывается ровно 1 раз. Если же в слоте добавить корректировку даты-времени через setDateTime(), то получается ситуация, которую я описал выше.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 9.4.2012, 6:02
Сообщение #7


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


phlegmatik, phlegmatik,
Цитата(phlegmatik @ 9.4.2012, 8:56) *
Если не вызывать в слоте 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().
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 5.12.2024, 1:59