Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Paramon от Июнь 25, 2014, 11:05



Название: Отключить в окне кнопку "Закрыть"
Отправлено: Paramon от Июнь 25, 2014, 11:05
Пробовал так, но окно просто прячется. К winapi прибегать не хотелось бы.
Код:
this->setWindowFlags(Qt::MSWindowsFixedSizeDialogHint | Qt::WindowTitleHint | Qt::Dialog | Qt::WindowMinimizeButtonHint | Qt::CustomizeWindowHint);

Если послать после установки флагов this->show(); - то работает, но это как-то неправильно.


Название: Re: Отключить в окне кнопку "Закрыть"
Отправлено: Johnik от Июнь 25, 2014, 11:40
closeEvent (http://qt-project.org/doc/qt-4.8/qwidget.html#closeEvent)


Название: Re: Отключить в окне кнопку "Закрыть"
Отправлено: Paramon от Июнь 25, 2014, 12:12
closeEvent (http://qt-project.org/doc/qt-4.8/qwidget.html#closeEvent)
И как мне это поможет отключить (сделать недоступными) кнопку [X] в правом верхнем углу и пункт в системном меню? ::)


Название: Re: Отключить в окне кнопку "Закрыть"
Отправлено: Zerkin от Июнь 25, 2014, 15:03
Paramon, я очень давно делал вот так, но это действительно неправильно и некрасиво.

Код
C++ (Qt)
setWindowFlags(((windowFlags() | Qt::CustomizeWindowHint)& ~Qt::WindowCloseButtonHint));
show();

А товарищ Johnik имел в виду, видимо, что стоит попробовать перехватит closeEvent и что-нибудь с этим сделать, правда это не то, что вам надо. Я так понимаю, что кнопка должна быть недоступна.


Название: Re: Отключить в окне кнопку "Закрыть"
Отправлено: Alex Custov от Июнь 25, 2014, 15:21
А как правильно, если setWindowFlags неправильно?


Название: Re: Отключить в окне кнопку "Закрыть"
Отправлено: GreatSnake от Июнь 25, 2014, 15:23
Довольно-таки странное желание коли создаёшь окно типа Dialog.


Название: Re: Отключить в окне кнопку "Закрыть"
Отправлено: Zerkin от Июнь 25, 2014, 15:26
А как правильно, если setWindowFlags неправильно?

Не в смысле, что это "неправильно" =) Как сделать это нормально без всяких сворачиваний лично мне неизвестно.

Могу предложить еще один костыль для винды.

Код
C++ (Qt)
HMENU menu = ::GetSystemMenu(this->winId(), FALSE);
      ::DeleteMenu(menu, SC_CLOSE, MF_BYCOMMAND);
      ::EnableMenuItem(menu, SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);

где this - ваш оконный виджет

Собственно взято это решение в своё время вот отсюда.
http://www.qtcentre.org/threads/9348-Disable-Close-button-%28X%29-of-a-QDialog


Название: Re: Отключить в окне кнопку "Закрыть"
Отправлено: Alex Custov от Июнь 25, 2014, 15:31
насколько я помню, если вызывать setWindowFlags() до show()/exec(), то всё будет в порядке.


Название: Re: Отключить в окне кнопку "Закрыть"
Отправлено: Zerkin от Июнь 25, 2014, 15:37
насколько я помню, если вызывать setWindowFlags() до show()/exec(), то всё будет в порядке.

Определенно =) А если виджет уже отшоувен? У автора именно такая ситуация, насколько я понимаю. Если флаги меняются уже после первоначальной инициализации и при активном зашоувленном окне?


Название: Re: Отключить в окне кнопку "Закрыть"
Отправлено: Paramon от Июнь 26, 2014, 09:42
Спасибо за ответы.
Я забыл, что когда давным-давно пытался сделать то же на winapi - столкнулся с той же проблемой. Помогало только сворачивание-разворачивание окна. Как решил (и решил ли) уже не помню.  :(


Название: Re: Отключить в окне кнопку "Закрыть"
Отправлено: Zerkin от Июнь 26, 2014, 10:45
Спасибо за ответы.
Я забыл, что когда давным-давно пытался сделать то же на winapi - столкнулся с той же проблемой. Помогало только сворачивание-разворачивание окна. Как решил (и решил ли) уже не помню.  :(

Сейчас протестировал один свой проект, прикрутил к нему эту фичу с HMENU. На винде работает на ура.


Название: Re: Отключить в окне кнопку "Закрыть"
Отправлено: Paramon от Июнь 26, 2014, 16:01
Сейчас протестировал один свой проект, прикрутил к нему эту фичу с HMENU. На винде работает на ура.
Если это вообще возможно реализовать - то хотелось бы силами Qt без winapi.
Вроде инсталлятор 5.х, написанный на себе, отключает кнопку "закрыть".