QWidget::mapToXXX/mapFromXXX
От: Мёртвый Даун Россия  
Дата: 31.03.16 08:24
Оценка: -1
Всем привет!

Ктото может что либо внятного объяснить по поводу семейства методов:

QWidget::mapToGlobal(QPoint)
QWidget::mapToParent(QPoint)
QWidget::mapTo(QPoint)

QWidget::mapFromGlobal(QPoint)
QWidget::mapFromParent(QPoint)
QWidget::mapFrom(QPoint)

1) ну это же какой то бред, то что они делают. Ничего не работает.
2) зачем у методов параметр QPoint? если мне нужно транслировать координаты виджета в координаты экрана, разумеется что я буду именно у него этот метод и дергать и использовать именно его координаты. Зачем еще параметр?
3) как ими вообще пользоваться?
4) простое: есть диалог, на нем кнопка. мне надо чтото нарисовать на или рядом с кнопкой. У кнопки есть
QPoint p = mybutton->pos();
пытаюсь чтото вывести по этим координатам, а оно вообще в другом углу рисуется. Понятно, что видимо весь секрет в тех методах, но к сожалению всё перепробовал, они не работают, и нифига не документировано.
5) зачем все эти переводы из чего то во чтото? думаю было бы намного проще:
QPoint p = mybutton->ХочуКоординатыНеважноОтносительноЧего(); // просто хочу координаты чтобы там чтото нарисовать
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re: QWidget::mapToXXX/mapFromXXX
От: AlexGin Беларусь  
Дата: 31.03.16 09:32
Оценка:
Здравствуйте, уважаемый Мёртвый Даун, Вы писали:
...
Насчёт применения mapToGlobal — я использую его для отображения контекстного меню:

FCmpWidget::FCmpWidget(...)
 : QWidget(parent), ...
{
...
setContextMenuPolicy(Qt::CustomContextMenu);

connect(this, &FCmpWidget::customContextMenuRequested,
                this, &FCmpWidget::ShowContextMenu);
...
}
...
void FCmpWidget::ShowContextMenu(const QPoint &pos)
{
   QMenu contextMenu("Context menu", this);

   QAction action1("Сравнить", this);
   QAction action2("Выход", this);
   connect(&action1, SIGNAL(triggered()), this, SLOT(on_pushBtnCmp_clicked()));
   connect(&action2, SIGNAL(triggered()), this, SLOT(OnExit()));

   contextMenu.addAction(&action1);
   contextMenu.addSeparator();
   contextMenu.addAction(&action2);

   contextMenu.exec(mapToGlobal(pos));  // пересчитать оконные координаты (координаты виджета) в глобальные
}


вот что делает mapToGlobal:
http://doc.qt.io/qt-4.8/qwidget.html#mapToGlobal

вот рекомендации — как вызывать контекстное меню:
1) http://stackoverflow.com/questions/24254006/rightclick-event-in-qt-to-open-a-context-menu
2) http://www.setnode.com/blog/right-click-context-menus-with-qt/
Отредактировано 31.03.2016 10:04 AlexGin . Предыдущая версия . Еще …
Отредактировано 31.03.2016 9:34 AlexGin . Предыдущая версия .
Re[2]: QWidget::mapToXXX/mapFromXXX
От: Мёртвый Даун Россия  
Дата: 31.03.16 10:19
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>Здравствуйте, уважаемый Мёртвый Даун, Вы писали:

AG>...
AG>Насчёт применения mapToGlobal — я использую его для отображения контекстного меню:

Да в том то и дело, с контекстными меню никаких проблем и нет...
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re: QWidget::mapToXXX/mapFromXXX
От: Chorkov Россия  
Дата: 31.03.16 10:25
Оценка: 18 (2) +4
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Всем привет!


МД>Ктото может что либо внятного объяснить по поводу семейства методов:


МД>QWidget::mapToGlobal(QPoint)

МД>QWidget::mapToParent(QPoint)
МД>QWidget::mapTo(QPoint)

МД>QWidget::mapFromGlobal(QPoint)

МД>QWidget::mapFromParent(QPoint)
МД>QWidget::mapFrom(QPoint)

Посмотри картинку по этой ссылке:
http://doc.qt.io/qt-4.8/application-windows.html#window-geometry
На этой картинке:
зеленые методы (x(), y(), frameGeometry(), pos(), move()) — в системе координат родительского виджета,
фиолетовыфе (geometry(), width(), height(), rect(), size())- в системе координат текущего виджета (у которого запрошены).
Так проще всего двигать дочерние виджеты относительно родителя.


МД>1) ну это же какой то бред, то что они делают. Ничего не работает.

МД>2) зачем у методов параметр QPoint? если мне нужно транслировать координаты виджета в координаты экрана, разумеется что я буду именно у него этот метод и дергать и использовать именно его координаты. Зачем еще параметр?
МД>3) как ими вообще пользоваться?
МД>4) простое: есть диалог, на нем кнопка. мне надо чтото нарисовать на или рядом с кнопкой. У кнопки есть
МД>QPoint p = mybutton->pos();

попробуй:
QPoint p = this->mapFrom( mybutton->parentWidget(), mybutton->pos() );
(если тебе надо рисовать в координатах this.)

Если не получилось — приведи полный код своего примера.

МД>пытаюсь чтото вывести по этим координатам, а оно вообще в другом углу рисуется. Понятно, что видимо весь секрет в тех методах, но к сожалению всё перепробовал, они не работают, и нифига не документировано.

МД>5) зачем все эти переводы из чего то во чтото? думаю было бы намного проще:
МД>QPoint p = mybutton->ХочуКоординатыНеважноОтносительноЧего(); // просто хочу координаты чтобы там чтото нарисовать

Чтобы не возникало таких дурных мыслей, предлагаю заодно помедитировать над:
http://doc.qt.io/qt-4.8/coordsys.html
http://doc.qt.io/qt-4.8/qt-demos-affine-example.html
http://doc.qt.io/qt-4.8/qtransform.html
Re[2]: QWidget::mapToXXX/mapFromXXX
От: Мёртвый Даун Россия  
Дата: 31.03.16 11:19
Оценка: -5 :)
Здравствуйте, Chorkov, Вы писали:

C>Посмотри картинку по этой ссылке:

C>http://doc.qt.io/qt-4.8/application-windows.html#window-geometry
C>На этой картинке:
C> зеленые методы (x(), y(), frameGeometry(), pos(), move()) — в системе координат родительского виджета,
C> фиолетовыфе (geometry(), width(), height(), rect(), size())- в системе координат текущего виджета (у которого запрошены).
C>Так проще всего двигать дочерние виджеты относительно родителя.

Это вообще какое то зло! У меня есть только экран, и следовательно его координаты. Всё остальное — не нужно.

Нет, всё равно там ничего не работает, впрочем как и всё всегда в Qt.

Пример:

Диалоговое окно, с кнопкой. Кнопка где-то произвольно на диалоге лежит. Мне надо показать message box рядом с кнопкой.
Что за огород надо городить с какими то переводами координат? Ну естессно нужны экранные! Экранные!!! Долбанное Qt!!! Всегда нужны экранные! Одни, единственные!
Почему: mybutton->pos() возвращает всегда QPoint(0, 0) ??? Кто это всё проектировал в Qt? Надеюсь он уже прокрутил пальцы через мясорубку?
mybutton->mapToGlobal(mybutton->pos()); // вообще бред возвращает... но другие методы этого семейства вообще ничего не возвращают.

Как это сделать? Ну почему всегда возникают проблемы на пустом месте в этом сраном Qt????????????????????

Ок, подскажи плиз, как мне узнать координаты хоть чего то в окне, чтобы чтото показать по этим координатам? Оно ничего не работает.

Короче хрень полная.

Опустимся до самого элементарного вопроса:
Кнопка на диалоге. Диалог по середине экрана. Так, что кнопка тоже ровно по середине экрана. Я хочу следующее:
(Псевдокод)
QPoint p = mybutton->pos(); // ВОТ ЗДЕСЬ p ДОЛЖЕН ЖЕЛЕЗОБЕТОННО БЫТЬ QPoint(screen.width/2, screen.height/2)

Какие действия для этого надо проделать? Что может быть проще????? Жесть!!!!!!!!!!!!!!!!
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Отредактировано 31.03.2016 11:37 Мёртвый Даун . Предыдущая версия . Еще …
Отредактировано 31.03.2016 11:22 Мёртвый Даун . Предыдущая версия .
Отредактировано 31.03.2016 11:21 Мёртвый Даун . Предыдущая версия .
Re[3]: QWidget::mapToXXX/mapFromXXX
От: Igore Россия  
Дата: 31.03.16 14:23
Оценка: 8 (2) +1
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Опустимся до самого элементарного вопроса:

МД>Кнопка на диалоге. Диалог по середине экрана. Так, что кнопка тоже ровно по середине экрана. Я хочу следующее:
МД>(Псевдокод)
МД>QPoint p = mybutton->pos(); // ВОТ ЗДЕСЬ p ДОЛЖЕН ЖЕЛЕЗОБЕТОННО БЫТЬ QPoint(screen.width/2, screen.height/2)

МД>Какие действия для этого надо проделать? Что может быть проще????? Жесть!!!!!!!!!!!!!!!!

Пример сделай, а так ответ mybutton->mapToGlobal( mybutton->pos() );

Телепатия подсказывает что ты пытаешься все эксперименты делать в конструкторе и у тебя всегда QPoint(0,0), делай так:
QTimer::singleShot( 0, this, [ this ](){
     qDebug() << ui_->mybutton->pos();
     qDebug() << ui_->mybutton->mapToGlobal( ui_->mybutton->pos() );
} );
Отредактировано 31.03.2016 14:29 Igore . Предыдущая версия .
Re[4]: QWidget::mapToXXX/mapFromXXX
От: Мёртвый Даун Россия  
Дата: 01.04.16 03:21
Оценка:
Здравствуйте, Igore, Вы писали:

I>Телепатия подсказывает что ты пытаешься все эксперименты делать в конструкторе и у тебя всегда QPoint(0,0), делай так:

I>
I>QTimer::singleShot( 0, this, [ this ](){
I>     qDebug() << ui_->mybutton->pos();
I>     qDebug() << ui_->mybutton->mapToGlobal( ui_->mybutton->pos() );
I>} );
I>


А что там [this] означает? (Ну понятно что это новый синтаксис signal/slot в Qt 5)
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re[5]: QWidget::mapToXXX/mapFromXXX
От: Igore Россия  
Дата: 01.04.16 06:32
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

I>>Телепатия подсказывает что ты пытаешься все эксперименты делать в конструкторе и у тебя всегда QPoint(0,0), делай так:

I>>
I>>QTimer::singleShot( 0, this, [ this ](){
I>>     qDebug() << ui_->mybutton->pos();
I>>     qDebug() << ui_->mybutton->mapToGlobal( ui_->mybutton->pos() );
I>>} );
I>>


МД>А что там [this] означает? (Ну понятно что это новый синтаксис signal/slot в Qt 5)

Почитай про C++11 lambda, они добавили возможность передать в singleShot фуктор. В лямбде пишу [ this ]чтобы можно было обращаться к this, если его не захватить то нельзя будет вызвать this->ui_->mybutton, это будет просто свободная функция. Можно переписать так
QPushButton* btn = ui_->btnSave;
QTimer::singleShot( 0, this, [ btn ](){
     qDebug() << btn->pos();
     qDebug() << btn->mapToGlobal( btn->pos() );
} );

Если брать старый С++ то этот пример выглядел бы так
struct PrintButtonPos
{
     PrintButtonPos( QPushButton* btn_ ) : btn_( btn_ ) {}

     void operator()() {
          qDebug() << btn_->pos();
          qDebug() << btn_->mapToGlobal( btn_->pos() );
     }

     QPushButton* btn_;
};

QTimer::singleShot( 0, PrintButtonPos( ui_->btnSave ) );

Лямбда это считай неименованый функтор, хотя если использовать Qt4 то я бы просто писал QTimer::singleShot( 0, this, SLOT( onStarted ) ); Главное чтобы прошел цикл доставки сообщений и данные на форме уже были размещены, тогда у элементов будет и позиция и правильная высота, ширина.
Re[3]: QWidget::mapToXXX/mapFromXXX
От: _hum_ Беларусь  
Дата: 01.04.16 10:44
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Опустимся до самого элементарного вопроса:

МД>Кнопка на диалоге. Диалог по середине экрана. Так, что кнопка тоже ровно по середине экрана. Я хочу следующее:
МД>(Псевдокод)
МД>QPoint p = mybutton->pos(); // ВОТ ЗДЕСЬ p ДОЛЖЕН ЖЕЛЕЗОБЕТОННО БЫТЬ QPoint(screen.width/2, screen.height/2)

МД>Какие действия для этого надо проделать? Что может быть проще????? Жесть!!!!!!!!!!!!!!!!


Мёртвый Даун, может, просто дело в том, что вы мыслите всегда глобальными координатами. А часто удобно работать локальными. Если у вас диалог посреди экрана, то вместо того, чтобы позиционировать кнопку на нем тоже "посреди экрана", можно просто позиционировать кнопнку посреди диалога (тогда она автоматически окажется и посреди экрана). Иными словами, вместо

МД>(Псевдокод)

МД>QPoint p = mybutton->pos(); // ВОТ ЗДЕСЬ p ДОЛЖЕН ЖЕЛЕЗОБЕТОННО БЫТЬ QPoint(screen.width/2, screen.height/2)

надо мыслить

(Псевдокод)
QPoint p = mybutton->pos(); // ВОТ ЗДЕСЬ p ДОЛЖЕН ЖЕЛЕЗОБЕТОННО БЫТЬ в локальных координатах QPoint(dialog.width/2, dialog.height/2)


На всякий случай нюансы:
— функция pos() дает координаты виджета в локальных координатах (то есть, относительно верхнего левого угла родительского виджета)
— к функциям геометрии виджета типа rect(), geometry() корректно обращаться только после того, как он будет первый раз отрисован (станет первый раз виден), потому в конструкторе ими лучше не пользоваться (а например, в обработчике virtual void showEvent(QShowEvent * event) )
Re[3]: QWidget::mapToXXX/mapFromXXX
От: _hum_ Беларусь  
Дата: 01.04.16 10:49
Оценка:
п.с. для позиционирования виджетов внутри родительского окна придуманы лэйуаты, которые сэкономят вам кучу времени и нервов. не поленитесь, почитайте (это одна из тех вещей, что в свое время меня восхитила больше всех в qt, и за нее можно многое простить )
Re[4]: QWidget::mapToXXX/mapFromXXX
От: AlexGin Беларусь  
Дата: 02.04.16 10:08
Оценка:
Здравствуйте, уважаемый _hum_, Вы писали:

__>п.с. для позиционирования виджетов внутри родительского окна придуманы лэйуаты, которые сэкономят вам кучу времени и нервов. не поленитесь, почитайте (это одна из тех вещей, что в свое время меня восхитила больше всех в qt, и за нее можно многое простить )

+100500
Да, именно идеология лайоутов мне очень понравилась в Qt.
Скажем так — после MFC и WinAPI (где всё время в OnSize делаем кучу всяких MoveWindow)
— это было то, что меня приятно удивило
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.