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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как предотвратить закрытие диалогового окна?  (Прочитано 4392 раз)
Bolonat
Чайник
*
Offline Offline

Сообщений: 56


Qt Creator 4.5.0 на Qt 5.10.0 (W10 x64) MinGW 5.3.


Просмотр профиля
« : Май 17, 2019, 08:54 »

Здравствуйте!
Создаю диалоговое окно с кнопками Ok и Отмена. Обрабатываю нажатие кнопки Ок  - в  слоте accepted() - проверяю правильность введенных пользователем данных. Хочу, если пользователь ввел неверные данные, предотвратить закрытие диалогового окна, сообщить пользователю об ошибке и установить фокус в поле, где пользователь ввел ошибку. Но у меня не получается предотвратить закрытие диалогового окна. Подскажите, как это сделать?  

Код:

//Активация диалогового окна по кнопке мыши на главном виджете
void TimeValuePanel::mousePressEvent(QMouseEvent *event)
{
    if(!pSetPeriod){
         pSetPeriod = new SetPeriod(dtList.first(),dtList.last(),this);
    }

    if(pSetPeriod->exec()==QDialog::Accepted);
    {
        calcNewTimeList(m_dt1,m_dt2);
    }

}

//Обработка нажатия кнопки  Ок в диалоговом окне, проверка введенных данных
void SetPeriod::on_buttonBox_accepted()
{
    //Проверка введенных данных
    if(ui->dTimeBeg->dateTime()<m_dt1)
    {
        MesBoxErr("Начальная дата выходит за границы общего периода");
        ui->dTimeBeg->setFocus();
        //Здесь хочу предотвратить закрытие окна, но QDialog::DialogCode
        //принимает только два значения  Accepted и Rejected
        //в обоих случаях окно закрывается. Где и какой флаг
        //надо установить, чтобы окно не закрывалось?
    }
}

« Последнее редактирование: Май 17, 2019, 09:07 от Bolonat » Записан
Swa
Самовар
**
Offline Offline

Сообщений: 170


Просмотр профиля
« Ответ #1 : Май 17, 2019, 09:12 »

Нужно перегрузить функцию accept

Код:
Конструктор:
okButton = new QPushButton("OK", this);
okButton->setDefault(true);
QObject::connect(okButton, SIGNAL(clicked()), this, SLOT(accept()));
cancelButton = new QPushButton("Cancel", this);
QObject::connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject()));

void Widget::accept() {
if (...) {
// Если некорректные данные
return;
} else {
QDialog::accept();
}
}
Записан
Bolonat
Чайник
*
Offline Offline

Сообщений: 56


Qt Creator 4.5.0 на Qt 5.10.0 (W10 x64) MinGW 5.3.


Просмотр профиля
« Ответ #2 : Май 17, 2019, 09:24 »

Нужно перегрузить функцию accept
...
Спасибо! Получилось.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Май 20, 2019, 06:09 »

Bolonat, обрати внимание на названия большинства сигналов Qt, они имеют окончание "-ed", т.е. прошедшее время. Такие сигналы посылаются после того, как что-то случилось.
« Последнее редактирование: Май 23, 2019, 12:41 от lit-uriy » Записан

Юра.
Bolonat
Чайник
*
Offline Offline

Сообщений: 56


Qt Creator 4.5.0 на Qt 5.10.0 (W10 x64) MinGW 5.3.


Просмотр профиля
« Ответ #4 : Май 22, 2019, 07:10 »

Bolonat, обрати внимание на названия большинства сигналов Qt, они имеют окончание "-ed", т.е. прошедшее время. Такие слоты посылаются после того, как что-то случилось.
Я обрабатываю событие - нажатие пользователем кнопки ОК. Все возможные слоты для данного случая - это accepted(), clicked(). И в них никак нельзя предотвратить закрытие окна. Но проблема уже решена, как предложили выше.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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