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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сбрасываются координаты после hide()  (Прочитано 4843 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Апрель 10, 2009, 22:27 »

Здравствуйте!


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

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

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

Собираю информацию по крупицам
http://webhamster.ru
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #1 : Апрель 11, 2009, 00:38 »

Мда, что-то залипуха на залипухе.

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

Window x  -4  y  -24

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

Собираю информацию по крупицам
http://webhamster.ru
MoPDoBoPoT
Гость
« Ответ #2 : Апрель 11, 2009, 12:31 »

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

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

Сообщений: 754



Просмотр профиля WWW
« Ответ #3 : Апрель 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 она не нажимается.
« Последнее редактирование: Апрель 11, 2009, 13:59 от xintrea » Записан

Собираю информацию по крупицам
http://webhamster.ru
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Апрель 11, 2009, 23:27 »

Насчет сохранения позиции, попробуй использорвать QWidget::saveGeometry() \ QWidget::restoreGeometry(...)
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #5 : Апрель 14, 2009, 03:14 »

Насчет сохранения позиции, попробуй использорвать QWidget::saveGeometry() \ QWidget::restoreGeometry(...)

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

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

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

« Последнее редактирование: Апрель 14, 2009, 03:19 от xintrea » Записан

Собираю информацию по крупицам
http://webhamster.ru
Danila_Bagrofff
Гость
« Ответ #6 : Апрель 14, 2009, 07:06 »

а нужно именно hide делать? Почему бы не убивать окошко?

А ты в eventFilter() пробовал поймать нужное событие? Может, там что-то можно придумать?)
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #7 : Апрель 14, 2009, 09:47 »

2 xintrea: Юзай showEvent и closeEvent для этого. И глянь пример QTDIR/examples/mainwindows/application/
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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