Циклит QDialog::exec() в рамках QMdiArea |
Здравствуйте, гость ( Вход | Регистрация )
Циклит 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 |
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 |
по поводу диалога в МДИ: я на практике убедился, что почти всегда стоит делать окна, заранее не главные, наследниками 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 |
Буду пробовать следующий вариант - наследовать Form от QMdiSubWindow. Пока не прокатило... Требуются сложные переделки. По-простому не получилось. покажи код как ты создаёшь и вызываешь субокно/диалог Код довольно сложный. Готовы ли Вы разбираться в нем? Сегодня постараюсь подготовить. Выложу не весь, а только те куски кода, которые имеют отношение к проблеме. Сообщение отредактировал mva - 18.3.2010, 17:46 |
|
|
Текстовая версия | Сейчас: 26.11.2024, 23:01 |