crossplatform.ru

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

> Циклит QDialog::exec() в рамках QMdiArea
mva
  опции профиля:
сообщение 18.3.2010, 10:03
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

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




Репутация:   0  


Добрый день!

Я хочу создать класс окна, который может работать в рамках QMdiArea как простое окно и как модальное. Делаю я это так (если все представить упрощенно):

CODE


class Form: public QDialog {
Q_OBJECT
public:
Form(QWidget* pwgt = 0);
...
protected:
QMdiSubWindow* mdiSubWindow;
virtual int exec();
virtual void show();
...
};

Form::Form(QWidget* pwgt): QDialog(pwgt, Qt::WindowTitleHint) {
...
mdiSubWindow = app->getMainWindow()->getWorkspace()->addSubWindow(this, Qt::Window);
mdiSubWindow->setAttribute(Qt::WA_DeleteOnClose, false);
mdiSubWindow->setVisible(false);
}

int Form::exec() {
return QDialog::exec(); // Здесь программа зацикливается - создает локальный обработчик событий, которые не поступают
}

void Form::show() {
QDialog::show(); // Здесь программа нормально работает
}



Проблема в том, что если я вызываю Form.show(), то все работает нормально, а если вызываю Form.exec(), то программа начинает циклить, и не отвечает ни на клавиатуру, ни на мышь.

Что я делаю не так?

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Litkevich Yuriy
  опции профиля:
сообщение 18.3.2010, 13:15
Сообщение #2


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

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

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




Репутация:   94  


Цитата(mva @ 18.3.2010, 14:37) *
Form::show() или Form::exec()
вообще открытые члены в наследниках не принято скрывать.
Т.к. это нарушает интуитивность API.
Если у класса Base, есть октрытый член foo(), то применительно к наследнику руки потянутся его вызвать, ошибка при компиляции поставит человека в тупик

по поводу диалога в МДИ:
я на практике убедился, что почти всегда стоит делать окна, заранее не главные, наследниками QWidget, т.к. их мы можем поместить куда угодно, в том числе в наследник QDialog.

В МДИ, я думаю, возникают проблемы, связанные с тем, что QDialog - всегда окно верхнего уровня, а parent в нём - всего лишь способ центровки и владения (для последующего удаления объекта).

П.С. имеет смысл переписать этот виджет пока совсем плохо не стало.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mva
  опции профиля:
сообщение 18.3.2010, 14:09
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 18.3.2010, 13:15) *
по поводу диалога в МДИ:
я на практике убедился, что почти всегда стоит делать окна, заранее не главные, наследниками QWidget, т.к. их мы можем поместить куда угодно, в том числе в наследник QDialog.

В МДИ, я думаю, возникают проблемы, связанные с тем, что QDialog - всегда окно верхнего уровня, а parent в нём - всего лишь способ центровки и владения (для последующего удаления объекта).

П.С. имеет смысл переписать этот виджет пока совсем плохо не стало.


Наверное стоит попробовать унаследовать Form от QWidget, а не от QDialog.
...
Попробовал. Все равно так же циклит.
...
Буду пробовать следующий вариант - наследовать Form от QMdiSubWindow.

Сообщение отредактировал mva - 18.3.2010, 14:26
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mva
  опции профиля:
сообщение 18.3.2010, 17:46
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

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




Репутация:   0  


Цитата(mva @ 18.3.2010, 14:09) *
Буду пробовать следующий вариант - наследовать Form от QMdiSubWindow.


Пока не прокатило... Требуются сложные переделки. По-простому не получилось.

Цитата(Litkevich Yuriy @ 18.3.2010, 15:21) *
покажи код как ты создаёшь и вызываешь субокно/диалог


Код довольно сложный. Готовы ли Вы разбираться в нем? Сегодня постараюсь подготовить. Выложу не весь, а только те куски кода, которые имеют отношение к проблеме.

Сообщение отредактировал mva - 18.3.2010, 17:46
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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




RSS Текстовая версия Сейчас: 26.11.2024, 23:01