crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> QWidget::pos() vs X11, функция вовзращает бред.
lucifer_vrn
  опции профиля:
сообщение 13.5.2009, 20:33
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 27.2.2009
Пользователь №: 580

Спасибо сказали: 3 раз(а)




Репутация:   0  


сразу, все о чем идет речь сугобо проявляется под линуксом. По виндой все прекрасно.
что происходит:
когда я вызываю функцию QWidget::pos() с некоторой переодичностью, ко мне возвращается QPoint(0,0), хотя координата окна у меня явно не 0,0. Чуть реже но бывает, возвращает не правильную позицию окна +-5 пикселей по вертикали. я в шоке. промучался, вычитал в асисте в статье:
http://doc.crossplatform.ru/qt/en/4.5.0/geometry.html
Цитата
Don't be surprised if you find one where QWidget::frameGeometry() returns wrong results though.

теперь я уже не просто в шоке, а в полном шоке.
помучался, нашел небольшой выход -
QWidget::mapToGlobal(QPoint(0,0))
такой вызов уже (0,0) не возвращает, но +-5 пикселей от реальных координат возвращает.
ппц. я в полном шоке.
можно ли как нибудь достоврено получить координаты окна под Х11 ????

мой код примерно такой:

bool CommunicatorWidget::eventFilter ( QObject * watched, QEvent * event )
{

    if (watched == leftWidget_)
    {
        if (event->type() == QEvent::Hide && !isDock_ && leftWidget_->parent() == 0)
        {
            QPoint pos = leftWidget_->pos();
            if ( pos == QPoint(0,0))
                pos = leftWidget_->mapToGlobal(pos);
            qDebug() << "leftPosSave " << pos;
            Settings::CommunicatorWidget::setLeftWidgetRect(QRect(pos,leftWidget_->size()));
        }
    }
    return QWidget::eventFilter(watched,event);
}

тыкая туда - сюда окно(close()/show()) я вижу как в дебаге возвращается координата, которая по не понятным причинам в случайны момент начинает плыть то на 5 пикселей вврех, то на 5 пикселей вниз....
Причина редактирования: используй тэг code
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 13.5.2009, 21:05
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 601
Регистрация: 2.2.2009
Пользователь №: 523

Спасибо сказали: 101 раз(а)




Репутация:   9  


Если сделаешь небольшой компилируемый проект, то я с удовольствием проверю его у себя на Debian 5.0
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 13.5.2009, 21:17
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


На prog.org обсуждался этот вопрос, правда к решению так и не пришли.
http://www.prog.org.ru/topic_8639_0.html
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lucifer_vrn
  опции профиля:
сообщение 14.5.2009, 18:56
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 27.2.2009
Пользователь №: 580

Спасибо сказали: 3 раз(а)




Репутация:   0  


ну я то хоть какой-то решение нашел :) ( QWidget::mapToGlobal )
этот QWidget::mapToGlobal хоть не возвращает полный бред типа (0,0), а врет на пять пикселей.

есть еще какие нибудь варианты как можно получить позицию окна????? кроме х() и у(), которые работают также как и pos()
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
molchanoviv
  опции профиля:
сообщение 15.5.2009, 7:59
Сообщение #5


Старейший участник
****

Группа: Сомодератор
Сообщений: 597
Регистрация: 18.7.2008
Из: Саратов
Пользователь №: 238

Спасибо сказали: 41 раз(а)




Репутация:   5  


Если не ошибаюсь то в книге Бланшет было описано решение.(а если ошибаюсь, то у Макса Шлее)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lucifer_vrn
  опции профиля:
сообщение 15.5.2009, 16:53
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 27.2.2009
Пользователь №: 580

Спасибо сказали: 3 раз(а)




Репутация:   0  


molchanoviv, а в каком месте примерно не помнишь??? я в обеих книгах не нашел.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
molchanoviv
  опции профиля:
сообщение 15.5.2009, 17:04
Сообщение #7


Старейший участник
****

Группа: Сомодератор
Сообщений: 597
Регистрация: 18.7.2008
Из: Саратов
Пользователь №: 238

Спасибо сказали: 41 раз(а)




Репутация:   5  


Не помню.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lucifer_vrn
  опции профиля:
сообщение 15.5.2009, 19:14
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 19
Регистрация: 27.2.2009
Пользователь №: 580

Спасибо сказали: 3 раз(а)




Репутация:   0  


потанцевав с одним, двумя и более бубнами придумал следующее:
QPoint pos(rightWidget_->mapToGlobal(QPoint(0,0)).x()-rightWidget_->style()->pixelMetric(QStyle::PM_SplitterWidth)+1,rightWidget_->mapToGlobal(QPoint(0,0)).y()-titleHeight_);

, где заранее в конструкторе определен
titleHeight_ = style()->pixelMetric(QStyle::PM_TitleBarHeight);

как ни странно эта извращенская конструкция вовзращает правильные координаты....
конечно бред, но работает, меня в ней лишь смушает +1..... mapToGlobal(QPoint(0,0)).x() как оказалось вовращает координаты без заголовка и ширины полоски за которую растягиает окно. с заголовком я разобрался - titleHeight это оно и есть. заголовок в самом приложении у меня то есть то нету, поэтому я его как переменную вынес. а вот бордюрчик для растягивания, ширина которого как я понял и есть QStyle::PM_SplitterWidth) возвращает ширину меньшую на 1. может я не правильно запрашиваю эту ширину???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 15.5.2009, 21:56
Сообщение #9


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(lucifer_vrn @ 15.5.2009, 20:14) *
ширина которого как я понял и есть QStyle::PM_SplitterWidth) возвращает ширину меньшую на 1. может я не правильно запрашиваю эту ширину???
Если мне не изменяет память flankerr достаточно давно пытался решить похожую задачу, правда не помню решил ли он ее.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.5.2009, 22:33
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(ViGOur @ 16.5.2009, 1:56) *
возвращает ширину меньшую на 1
может в этом причина:
Цитата
Note that for historical reasons the values returned by the bottom() and right() functions deviate from the true bottom-right corner of the rectangle: The right() function returns left() + width() - 1 and the bottom() function returns top() + height() - 1. The same is the case for the point returned by the bottomRight() convenience function. In addition, the x and y coordinate of the topRight() and bottomLeft() functions, respectively, contain the same deviation from the true right and bottom edges.
из описания QRect

к слову сказать в QRectF такого замечания нет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 3.5.2024, 4:32