Russian Qt Forum
Ноябрь 24, 2024, 21:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QDialog: 1) как убрать AlwaysOnTop 2) как передать keyEvent другому виджиту  (Прочитано 3315 раз)
fulkabaster
Гость
« : Февраль 19, 2010, 17:53 »

Пара ламерских вопросов.
У приложения имеется главное окно QMainWindow. Также имеется диалоговое окно, унаследованное от QDialog и вызваемое при необходимости клавишей.
1) Это диалоговое окно сделал немодальным, но оно упрямо не хочет уходить с переднего плана. Когда обращаюсь к главному окну, диалог просто теряет фокус, но все равно закрывает собой главное окно - приходится постоянно его двигать. В асссистанте пошукал на тему "AlwaysOnTop" - ниче не нашел. Как решается?
2) И главное окно, и диалог обрабатывают событие QKeyPressEvent. Причем нужно сделать так, что если в фокусе диалог, то некоторые клавиши он просто передавал главному окну, чтобы оно обработало их по-своему. Судя по описанию, в этом должна помочь функция event->ignore(), т.к. она передает событие родительскому виджиту. Так и сделал, но нифига не работает. Диалог создается в главном окне, ему передается указатель this.

В главном окне:
Код
C++ (Qt)
MyDialog *my_dialog = new MyDialog(this);

Имплементация конструктора диалога:
Код
C++ (Qt)
MyDialog::MyDialog(QWidget *parent) : QDialog(parent) {
setupUi(this);
}
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Февраль 19, 2010, 18:21 »

>>передает событие родительскому виджиту
у виджета верхнего уровня, нет родителя, а в диалог указатель на родитель передаётся, чтобы знать относительно чего центриоваться.

Тут поможет установка фильтра событий в главном окне на диалог, т.е. в главном окне нужно сделать примерно так:
Код
C++ (Qt)
QDialog dialog;
dialog.installEventFilter(this);
...
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
...// Обработка события
 
return BaseClass::eventFilter(obj, event);
}
 
подробности смотри в описании QObject::eventFilter
Записан

Юра.
fulkabaster
Гость
« Ответ #2 : Февраль 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.
« Последнее редактирование: Февраль 20, 2010, 10:25 от fulkabaster » Записан
crossly
Гость
« Ответ #3 : Февраль 22, 2010, 20:25 »

по поводу первого.... делай диалогу show() а не exec()
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.28 секунд. Запросов: 22.