crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> запрет закрытия диалог. окна по нажатию ок
Rocky
  опции профиля:
сообщение 24.12.2008, 22:16
Сообщение #1


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

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




Репутация:   7  


Как сделать, чтобы если пользователь нажимает "ОК", то если небыло введено какое-то значение, то диалоговое окно не закрывалось?

Спасибо!

Потому что как я понимаю обработчик ОК вызывается уже после закрытия самого диалогового окна.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 24.12.2008, 22:46
Сообщение #2


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


Цитата(Rocky @ 24.12.2008, 22:16) *
Как сделать, чтобы если пользователь нажимает "ОК", то если небыло введено какое-то значение, то диалоговое окно не закрывалось?

Спасибо!

Потому что как я понимаю обработчик ОК вызывается уже после закрытия самого диалогового окна.


предлагаю переместить вопрос в тему анекдоты :)

покажи код. что и при каких событиях ты закрываешь???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 24.12.2008, 23:27
Сообщение #3


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

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




Репутация:   7  


Ок, вопрос идиотский я полностью согласен ))) Просто на MFC это делается элементарно. На QT такой фокус не проходит.


//.h
namespace ValtecWarmFloor
{
    class CRoomDialog : public QDialog, public Ui_CRoomDialog
    {
        Q_OBJECT
        ...
private slots:
        ...
        void OnBnClickedBtnOk();
    }
}

//.cpp
CRoomDialog::CRoomDialog(CValtecWarmFloor *pValtecWarmFloor, QWidget* pParent) : QDialog(pParent)
{
    ...
    QDialog::connect(okButton, SIGNAL(clicked()), this, SLOT(OnBnClickedBtnOk()));
    ...
}

void CRoomDialog::OnBnClickedBtnOk()
{
    if (m_pRoomName->text().isEmpty())
    {
        QMessageBox::question(m_pParentWidget, m_pMessage->GetMessage(eHeader),
            m_pMessage->GetMessage(eErrorRoomNameIsEmpty));
        return;
    }
    //другие действия
    ...
}


вот весь код. Если брейкпоинт ставить внутри хм.... слота (обработчика) OnBnClickedBtnOk() то падаю я в него уже после того как диалоговое окно закрылось. Т.е. в данном случае, если содержимое m_pRoomName (LineEdit) пусто, то по return-у я выхожу естественно из слота, но само диалоговое окно уже закрыто. В MFC такой "фокус" прокатывал без проблем... Здесь нет. Поэтому я и спрашиваю, как правильно поступать. Кажется есть такой closeEvent(...). Может его перехватывать, и возвращать код (accepted и пр.) в зависимости от нужд? Или как?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 24.12.2008, 23:31
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

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




Репутация:   7  


В MFC диалоговое окно закрывают методы CDialog::OnOk и CDialog::OnCacel. Которые приводят к вызову EndDialog. Если до их вызова ставить return, то диалоговое окно не закрывается... Непонятно как тут поступать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
molchanoviv
  опции профиля:
сообщение 24.12.2008, 23:37
Сообщение #5


Старейший участник
****

Группа: Сомодератор
Сообщений: 597
Регистрация: 18.7.2008
Из: Саратов
Пользователь №: 238

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




Репутация:   5  


Ну так и тут QDialog::Accepted и если не ошибаюсь QDialog::Rejected Но зачем тебе это? Может просто сделать окно немодальным? Я просто немного не понял.

Сообщение отредактировал molchanoviv - 24.12.2008, 23:39
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 24.12.2008, 23:56
Сообщение #6


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


слушай, действовать череЗ closeEvent() можно элементарно переопределяя его в своем классе наследнике тем или иным образом от QWidget. можно юзать фильтры событий .... и т.д.
но честно говоря, это как-то черз шиворот навыворот для твоей простенькой задачки.
я бы создал свой виджет - пусть он не наследник QDialog а просто наследник QWidget. разместил на нем что тебе там надо (думаю не много)
и обрабатывал сам нажатия на кнопки.

думаю даже на размер кода это не повлияет...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 25.12.2008, 0:02
Сообщение #7


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

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




Репутация:   7  


Цитата(molchanoviv @ 24.12.2008, 23:37) *
Ну так и тут QDialog::Accepted и если не ошибаюсь QDialog::Rejected Но зачем тебе это? Может просто сделать окно немодальным? Я просто немного не понял.

А откуда их возвращать? Из closeEvent? А как узнать тогда, сам этот closeEvent был вызван после нажатия OK или Cancel? Можно конечно через флаги (переменные типа bool) все сделать.... Но это какое-то химиченье ...имхо....
Немодальным окно сделать нельзя, т.к. нельзя давать пользователю делать какие-то действия, пока он не завершит текущие грубо говоря.

Цитата
Я просто немного не понял.

Есть модальное диалоговое окно. Есть кнопка OK (имя объекта okButton). Как сделать, чтобы по нажатию на ОК диалоговое окно закрывалось, если все поля в нем заполнены правильно, и не закрывалось, если хотя бы одно из полей не заполнено. В приведенном выше коде диалоговое окно закрывается всегда.

kwisp

Ок, доберусь до работы попробую. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 25.12.2008, 0:15
Сообщение #8


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


смотри. по нажатии на кнопке она высылает сигнал clicked()

соединяешь сигнал этой кнопки со слотом обработчиком где нибудь скажем в конструкторе.
connect(&okButton,SIGNAL(clicked()),this,SLOT(CheckField()));

::CheckField()//вызовется при нажатии на кнопке
{
if([хоть одно поле не заполнено == true) return;//проверяешь что тебе надо

this->quit();//закрываешь если надо
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 25.12.2008, 11:28
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Rocky, ты ведь делаешь наследника от QDialog. Тогда в твоем классе CRoomDialog можно сделать так:
пользователь в водит данные в виджет, по изменению в этом виджете срабатывает слот проверки, если все верно, то конпка Ок становится активной. А изначально она не активна и пользователь не может на нее нажать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 25.12.2008, 12:22
Сообщение #10


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


Цитата(Litkevich Yuriy @ 25.12.2008, 11:28) *
Rocky, ты ведь делаешь наследника от QDialog. Тогда в твоем классе CRoomDialog можно сделать так:
пользователь в водит данные в виджет, по изменению в этом виджете срабатывает слот проверки, если все верно, то конпка Ок становится активной. А изначально она не активна и пользователь не может на нее нажать.


+1 балл.
красивое решение.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 30.12.2024, 21:27