Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Bolonat от Май 17, 2019, 08:54



Название: Как предотвратить закрытие диалогового окна?
Отправлено: Bolonat от Май 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
        //в обоих случаях окно закрывается. Где и какой флаг
        //надо установить, чтобы окно не закрывалось?
    }
}



Название: Re: Как предотвратить закрытие диалогового окна?
Отправлено: Swa от Май 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();
}
}


Название: Re: Как предотвратить закрытие диалогового окна?
Отправлено: Bolonat от Май 17, 2019, 09:24
Нужно перегрузить функцию accept
...
Спасибо! Получилось.


Название: Re: Как предотвратить закрытие диалогового окна?
Отправлено: lit-uriy от Май 20, 2019, 06:09
Bolonat, обрати внимание на названия большинства сигналов Qt, они имеют окончание "-ed", т.е. прошедшее время. Такие сигналы посылаются после того, как что-то случилось.


Название: Re: Как предотвратить закрытие диалогового окна?
Отправлено: Bolonat от Май 22, 2019, 07:10
Bolonat, обрати внимание на названия большинства сигналов Qt, они имеют окончание "-ed", т.е. прошедшее время. Такие слоты посылаются после того, как что-то случилось.
Я обрабатываю событие - нажатие пользователем кнопки ОК. Все возможные слоты для данного случая - это accepted(), clicked(). И в них никак нельзя предотвратить закрытие окна. Но проблема уже решена, как предложили выше.