![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
mva |
![]()
Сообщение
#1
|
Участник ![]() ![]() Группа: Участник Сообщений: 104 Регистрация: 15.3.2009 Из: Киров Пользователь №: 615 Спасибо сказали: 3 раз(а) Репутация: ![]() ![]() ![]() |
Добрый день!
Я хочу создать класс окна, который может работать в рамках 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(), то программа начинает циклить, и не отвечает ни на клавиатуру, ни на мышь. Что я делаю не так? |
|
|
![]() |
kwisp |
![]()
Сообщение
#2
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
вопрос еще почему переопределяется show() && exec() в секции protected если это вообще открытые слоты, да еще и делаются виртуальными???
не понятна цель настолько хитрого заворота. |
|
|
mva |
![]()
Сообщение
#3
|
Участник ![]() ![]() Группа: Участник Сообщений: 104 Регистрация: 15.3.2009 Из: Киров Пользователь №: 615 Спасибо сказали: 3 раз(а) Репутация: ![]() ![]() ![]() |
вопрос еще почему переопределяется show() && exec() в секции protected если это вообще открытые слоты, да еще и делаются виртуальными??? не понятна цель настолько хитрого заворота. Потому что в оригинале эти функции называются doShow() и doExec() и переопределяются в наследуемых классах, а их вызов производится собственно публичными функциями show() и exec(), которые определены в базовом классе Form, но не переопределяются в наследуемых классах. Хотел упростить восприятие, но видимо наоборот усложнил. Будем считать, что я имею такой код: CODE class Form: public QDialog { Q_OBJECT public: Form(QWidget* pwgt = 0); int exec() { return doExec(); } void show() { return doShow(); } ... protected: QMdiSubWindow* mdiSubWindow; virtual int doExec(); virtual void doShow(); ... }; 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::doExec() { ... return QDialog::exec(); // Здесь программа зацикливается - создает локальный обработчик событий, которые не поступают } void Form::doShow() { ... QDialog::show(); // Здесь программа нормально работает } |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 4.7.2025, 6:04 |