Название: Скрыть виджет, если кликнуть не на нем Отправлено: devnikor от Январь 26, 2014, 22:38 Здравствуйте. Необходимо написать виджет, который бы скрывался, если пользователь кликнет в какой-либо другой области. Примером может служить область с часами в Windows. Если мы на нее нажмем, то появится календарь и часы, а если потом кликнем, например, на рабочий стол, что окошко с календарем скроется.
Частично решает проблему флаг Qt::Popup, вот только нужно сначала кликнуть на виджет, а потом на любую другую область, и тогда он скроется Название: Re: Скрыть виджет, если кликнуть не на нем Отправлено: kambala от Январь 26, 2014, 23:07 повесь фильтр событий на окно верхнего уровня (или вообще на qApp), отлавливай там клики мыши и смотри попадают ли они в твой виджет
Название: Re: Скрыть виджет, если кликнуть не на нем Отправлено: Bepec от Январь 27, 2014, 09:21 Фокус вам поможет.
Название: Re: Скрыть виджет, если кликнуть не на нем Отправлено: Kurles от Январь 27, 2014, 10:04 Фокус вам поможет. С фокусом очень много геморроя выйдет. Гораздо проще через фильтр событий.Название: Re: Скрыть виджет, если кликнуть не на нем Отправлено: Igors от Январь 27, 2014, 10:33 А просто setCapture чтобы все сделать в самом окне?
Да, и кстати - popup окно фокус не меняет (и это правильно) Название: Re: Скрыть виджет, если кликнуть не на нем Отправлено: Bepec от Январь 27, 2014, 10:35 Почему много? Одно событие - focusOut, которое принимают все наследники QWidget.
И в нём написать hide(); Вот полный псевдокод При появлении виджета Код: myWidget->setFocus(Qt::MouseFocusReason); В коде виджета Код: void MyWidget::focusOutEvent ( QFocusEvent * event ) update: Если условие только при нажатии мышки, тогда да, проще через фильтр событий сделать. Название: Re: Скрыть виджет, если кликнуть не на нем Отправлено: devnikor от Январь 27, 2014, 11:29 Да, мне надо, чтобы только при клике мышке убиралось окно
Насчет фильтра событий, не могли бы вы привести пример или объяснить немного поподробнее? Окно верхнего уровня это QDesktopWidget? Название: Re: Скрыть виджет, если кликнуть не на нем Отправлено: kambala от Январь 27, 2014, 13:06 пример фильтра событий (метод eventFilter) есть в документации, в нем описывается как «съедать» клавиатурные нажатия.
окно верхнего уровня — тот виджет, который у тебя является окном, на котором размещены все остальные виджеты (наследник QMainWindow например). Название: Re: Скрыть виджет, если кликнуть не на нем Отправлено: devnikor от Январь 27, 2014, 13:08 Спасибо, буду разбираться
Название: Re: Скрыть виджет, если кликнуть не на нем Отправлено: kambala от Январь 27, 2014, 13:32 накидал тестовый проект: при клике по виджету лейбл исчезает, при клике в области лейбла он появляется. проверял в 4.8.5 и 5.2 на винде.
Код
Название: Re: Скрыть виджет, если кликнуть не на нем Отправлено: Igors от Январь 27, 2014, 14:14 MousePressEvent не придет если кликнуто в титул или вне окон приложения. Мой вариант
Код
Название: Re: Скрыть виджет, если кликнуть не на нем Отправлено: devnikor от Январь 27, 2014, 17:21 Спасибо, вроде разобрался :)
|