Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: xintrea от Апрель 10, 2009, 22:27



Название: Сбрасываются координаты после hide()
Отправлено: xintrea от Апрель 10, 2009, 22:27
Здравствуйте!


Есть у меня окно поиска, наследуемое от QDialog. Оно у меня существует постоянно, вместе с областью редактируемого текста QTextEdit. И когда нажимается Ctrl+F, окно поиска показывается через метод show(). Ну а скрывается оно через метод hide(), если нажать ESC или кнопку закрытия.

Проблема в том, что после вызова hide() координаты окна сбрасываются, и при следующем show() окно появляется по центру редактируемого текста, хотя пользователь перетаскивал окно туда, где ему удобнее.

Вопрос: как сделать так, чтоб координаты не сбрасывались? Городить огород с запоминанием координат, или можно сделать как-то прощще?


Название: Re: Сбрасываются координаты после hide()
Отправлено: xintrea от Апрель 11, 2009, 00:38
Мда, что-то залипуха на залипухе.

Повесил запоминание координат в самописный обработчик hideEvent(). Видимо из-за того, что он вызывается после сокрытия окна, в координатах иногда нормальные координаты остаются, а иногда

Window x  -4  y  -24

Как глюк этот поборот не пойму. Может, на что-то другое надо навешиваться?


Название: Re: Сбрасываются координаты после hide()
Отправлено: MoPDoBoPoT от Апрель 11, 2009, 12:31
Проблема в том, что после вызова hide() координаты окна сбрасываются, и при следующем show() окно появляется по центру редактируемого текста, хотя пользователь перетаскивал окно туда, где ему удобнее.

Такова особенность QDialog, что он по центру родителя появляется. Наследуйте окно поиска от QWidget и не заморачивайтесь с запоминанием координат.


Название: Re: Сбрасываются координаты после hide()
Отправлено: xintrea от Апрель 11, 2009, 13:52
Такова особенность QDialog, что он по центру родителя появляется. Наследуйте окно поиска от QWidget и не заморачивайтесь с запоминанием координат.

Попробовал наследоваться от QWidget, точно так же координаты при hide() и последующем show() сбрасываются, и виджет появляется по центру.

Но есть отличие - если наследоваться от QWidget, глюка с отрицательными координатами не наблюдается. Qt 4.5 Linux.


UPD: Чтоб снять лишние вопросы, координаты узнаю так

Код:
void EditorFindDialog::hideEvent(QHideEvent *event)
{
 qDebug() << "Window x " << this->x() << " y " << this->y();
}

Для QDialog этот метод иногда отрицательные цифры печатает.


UPD2: Но при смене QDialog на QWidget, перестаёт работать setDefault(true) на кнопке запуска поиска... Теперь на кнопку только мышой нажимать, а по Enter она не нажимается.


Название: Re: Сбрасываются координаты после hide()
Отправлено: pastor от Апрель 11, 2009, 23:27
Насчет сохранения позиции, попробуй использорвать QWidget::saveGeometry() \ QWidget::restoreGeometry(...)


Название: Re: Сбрасываются координаты после hide()
Отправлено: xintrea от Апрель 14, 2009, 03:14
Насчет сохранения позиции, попробуй использорвать QWidget::saveGeometry() \ QWidget::restoreGeometry(...)

Попробовал в hideEvent() сделать saveGeometry().

Проблема в том, что hideEvent()  вызывается не только при закрытии окна пользователем, но и самим Qt при инициализации окна. В этот момент геометрия окна нуливая, и сохраняется, соответсвенно нуливая геометрия.

UPD: Я даже в конструкторе виджета сделал проверку - когда отрабатывает hideEvent()... Так вот эта штука отрабатывает раньше конструктора виджета! Видимо потому, что hideEvent() относится к классу QWidget, от которого наследуется виджет, а QWidget инитится первым.



Название: Re: Сбрасываются координаты после hide()
Отправлено: Danila_Bagrofff от Апрель 14, 2009, 07:06
а нужно именно hide делать? Почему бы не убивать окошко?

А ты в eventFilter() пробовал поймать нужное событие? Может, там что-то можно придумать?)


Название: Re: Сбрасываются координаты после hide()
Отправлено: pastor от Апрель 14, 2009, 09:47
2 xintrea: Юзай showEvent и closeEvent для этого. И глянь пример QTDIR/examples/mainwindows/application/