Название: QDialog: 1) как убрать AlwaysOnTop 2) как передать keyEvent другому виджиту Отправлено: fulkabaster от Февраль 19, 2010, 17:53 Пара ламерских вопросов.
У приложения имеется главное окно QMainWindow. Также имеется диалоговое окно, унаследованное от QDialog и вызваемое при необходимости клавишей. 1) Это диалоговое окно сделал немодальным, но оно упрямо не хочет уходить с переднего плана. Когда обращаюсь к главному окну, диалог просто теряет фокус, но все равно закрывает собой главное окно - приходится постоянно его двигать. В асссистанте пошукал на тему "AlwaysOnTop" - ниче не нашел. Как решается? 2) И главное окно, и диалог обрабатывают событие QKeyPressEvent. Причем нужно сделать так, что если в фокусе диалог, то некоторые клавиши он просто передавал главному окну, чтобы оно обработало их по-своему. Судя по описанию, в этом должна помочь функция event->ignore(), т.к. она передает событие родительскому виджиту. Так и сделал, но нифига не работает. Диалог создается в главном окне, ему передается указатель this. В главном окне: Код
Имплементация конструктора диалога: Код
Название: Re: QDialog: 1) как убрать AlwaysOnTop 2) как передать keyEvent другому виджиту Отправлено: lit-uriy от Февраль 19, 2010, 18:21 >>передает событие родительскому виджиту
у виджета верхнего уровня, нет родителя, а в диалог указатель на родитель передаётся, чтобы знать относительно чего центриоваться. Тут поможет установка фильтра событий в главном окне на диалог, т.е. в главном окне нужно сделать примерно так: Код подробности смотри в описании QObject::eventFilter Название: Re: QDialog: 1) как убрать AlwaysOnTop 2) как передать keyEvent другому виджиту Отправлено: fulkabaster от Февраль 20, 2010, 10:22 Цитировать у виджета верхнего уровня, нет родителя, а в диалог указатель на родитель передаётся, чтобы знать относительно чего центриоваться. Не совсем понял. Если в QMainWindow создается объект QDialog и ему передается указатель this - разве это не значит, что родительским виджитом для диалога будет главное окно? Диалог ведь не будет виджитом верхнего уровня? Если так, то судя по описанию в асистанте, именно ignore() должен помочь:"You should call ignore() if the key press or release event is not handled by your widget. A key event is propagated up the parent widget chain until a widget accepts it with accept() or an event filter consumes it." Т.е. либо фильтром, либо accept() - второй вариант для меня был бы удобнее. По поводу eventFilter - так придется повторять дважды один и тот же код? Например, пусть для клавиши Z в главном окне в функции keyPressEven определны действия. Когда открыт диалог, и он в фокусе, и нажата клавиша Z, должны выполниться те же действия в гавном окне. Но если писать через фильтр, то как я понимаю, нужно снова писать код для тех же действий, только уже в функции eventFilter. Можно конечно напистаь одну отдельную функцию для нужных действий и вызывать ее и из keyPressEvent и из eventFilter. Название: Re: QDialog: 1) как убрать AlwaysOnTop 2) как передать keyEvent другому виджиту Отправлено: crossly от Февраль 22, 2010, 20:25 по поводу первого.... делай диалогу show() а не exec()
|