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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Модальный диалог  (Прочитано 24840 раз)
enola
Гость
« Ответ #15 : Сентябрь 11, 2006, 08:09 »

Сделал от QWidget, интерфейс что нужно, теперь сама реализация нужна, а именно некоторые весчи от QDialog:
  • Модальность
  • Слоты accept(), reject()
  • Результат (возвращаемое значение)

подскажите как такое можно реализовать?
Записан
bigirbis
Гость
« Ответ #16 : Сентябрь 11, 2006, 12:35 »

По поводу модальности:
void setWindowModality ( Qt::WindowModality windowModality );
Qt::WindowModal
Qt::ApplicationModal

По поводу accept()/reject() создай два слота у виджета и зацепи их к кнопарям.
Можно прикрутить enum флаг выполнения.
Если был какой-нибудь контекст диалога, то можно написать метод, который его возвращает или воткнуть в качестве возвращаемого значения из accept()/reject().
Записан
enola
Гость
« Ответ #17 : Сентябрь 11, 2006, 13:07 »

Млин что-то не получается:
  • Модальность, делаю:
    Код:
    MyForm::setWindowModality(Qt::WindowModal);

    опять кнопки не реагируют (не нажимаются), создан от QWidget?
  • Слоты, так если я создаю слоты accept и reject компилятор ругается?
Записан
bigirbis
Гость
« Ответ #18 : Сентябрь 11, 2006, 13:38 »

Цитировать
setWindowModality(Qt::WindowModal)

Это в конструкторе?

Цитировать
Слоты, так если я создаю слоты accept и reject компилятор ругается?

По идее не на что ругаться - вроде у QWidget нет таких имен...
Записан
enola
Гость
« Ответ #19 : Сентябрь 11, 2006, 14:03 »

Цитата: "bigirbis"
Цитировать
setWindowModality(Qt::WindowModal)

Это в конструкторе?

ну да.

Цитировать
По идее не на что ругаться - вроде у QWidget нет таких имен...

ошибка при компиляции LNK 2019.

 Грустный
Записан
bigirbis
Гость
« Ответ #20 : Сентябрь 11, 2006, 14:44 »

По поводу setWindowModality(Qt::WindowModal)
Цитировать
Changing this property while the window is visible has no effect; you must hide() the wiget first, then show() it again.


Вышли код с accept()/reject()
Записан
enola
Гость
« Ответ #21 : Сентябрь 11, 2006, 15:04 »

Слоты сделал вот как (работает, что-то я тормознул сначала):
Код:
void MyForm::accept()
{
setResult(1);
close();
}

void MyForm::reject()
{
setResult(0);
close();
}

void MyForm::setResult(const int &newResult)
{
iResult = newResult;
}


и хидер:
Код:
class MyForm: public QWidget
{
    Q_OBJECT
Q_PROPERTY(int Result READ Result WRITE setResult)

public:
    MyForm::MyForm(QWidget * parent);
int Result() const {return iResult;}

public slots:
void accept();
void reject();

private:
int iResult;

void setResult(const int &newResult);
};


потом создаю форму:
Код:
	MyForm *MyDialog = new MyForm(this);
MyDialog ->show();
if (MyDialog ->Result() == 1)
//.....

вот тут с результатом плохо, я так понимаю нужно, чтобы форма была модальная, иначе получается как у меня, а именно после show сразу далее идет обработка, а должно ждать результат. Что делать?
Записан
bigirbis
Гость
« Ответ #22 : Сентябрь 11, 2006, 15:21 »

Ну дык и опиши метод:

bool MyForm::exec()
{
}

посмотри как у QDialog сделано (там через QEventLoop).
И еще, не стоит стрелять диалог в accept()/reject() если не выставлен флаг Qt::WA_DeleteOnClose. Тем паче, что в этом случае контекст диалога тоже стреляется.
Записан
enola
Гость
« Ответ #23 : Сентябрь 11, 2006, 15:33 »

с exec это идея, завтра попробую, а вот с закрытием диалога что делать, когда его убивать?
Записан
bigirbis
Гость
« Ответ #24 : Сентябрь 11, 2006, 15:37 »

Можно создавать его объект в каком-нибудь слоте, и он разрушится, выйдя из области видимости.
Или создать указатель, а потом вызвать delete.
Как правило, так и делается.
А еще можно написать статику, которая просто возвращает или код, или контекст.
Записан
enola
Гость
« Ответ #25 : Сентябрь 12, 2006, 06:05 »

Цитата: "bigirbis"
Или создать указатель, а потом вызвать delete.
Как правило, так и делается.

А с этого момента пожалуйста поподробней, если не сложно с примером? Веселый

P.S. Сделал exec проверка проходит и результат возвращает, только когда повторно диалог создается вылетает ошибка, наверное как раз с удалением не реализовал, смотрел в стандартном диалоге, что-то запутанно не разобрался.
Записан
bigirbis
Гость
« Ответ #26 : Сентябрь 12, 2006, 08:36 »

Цитировать
А с этого момента пожалуйста поподробней, если не сложно с примером?

Код:

void slotSmth()
{
 ...
 MyDialog * dialog = new MyDialog( this );
 if( dialog->exec() )
 {
  ...
 }
 else
 {
  ...
 }
 ...
 if( dialog )
  delete dialog;
}


Qt все-таки на плюсах писано, надо Страуструпа читать.
Записан
enola
Гость
« Ответ #27 : Сентябрь 12, 2006, 09:45 »

Цитата: "bigirbis"
Qt все-таки на плюсах писано, надо Страуструпа читать.

Читал и почитываю. До этого я додумался, думал может что иное посоветуешь.
Записан
bigirbis
Гость
« Ответ #28 : Сентябрь 12, 2006, 11:10 »

Думаю, что-то иное тяжело придумать.

Можно, конечно, установить флаг Qt::WA_DeleteOnClose, а затем, в конце слота, вызвать close().
Записан
enola
Гость
« Ответ #29 : Сентябрь 12, 2006, 11:17 »

вот точно вот, что делается в стандартном Улыбающийся
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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