Russian Qt Forum

Qt => Общие вопросы => Тема начата: fulkabaster от Февраль 19, 2010, 17:53



Название: QDialog: 1) как убрать AlwaysOnTop 2) как передать keyEvent другому виджиту
Отправлено: 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);
}


Название: Re: QDialog: 1) как убрать AlwaysOnTop 2) как передать keyEvent другому виджиту
Отправлено: lit-uriy от Февраль 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


Название: 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()