![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
XpycT |
![]()
Сообщение
#1
|
|
![]() Студент ![]() Группа: Участник Сообщений: 43 Регистрация: 7.7.2009 Пользователь №: 883 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Всем доброго времени суток
![]() С Qt знаком всего полторы недели, и то, все это время читал книги. Вот захотелось реализовать виджет выбора рисунка (не хочется делать просто текстовое поле с адресом). За основу взял исходники примера с гита Qt. Но к моему сожалению понял, что прочитанных разделов о графике в книгах не достаточно ![]() Хочется сделать что-то типа такого : Но напоролся на пару вопросов: 1) Как в mouseMoveEvent определить потерю фокуса мыши (event->Leave почемуто действует аналогично event->Enter)? 2) Каким образом прикрутить сигнал/слот к иконке "Открыть"/"Очистить", если они выведены через painter.drawPicture Вот те исходники, над которыми я прыгал с бубном ![]() За раннее благодарю за помощь ![]() |
|
|
||
kwisp |
![]()
Сообщение
#2
|
![]() астарожна ынтжинэр ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
XpycT,
Цитата
на сколько я знаю так делать нельзя надо тчобы на одном контексте один рисовальщик был. + зачем тебе mouseMoveEvent(QMouseEvent *event) если есть enterEvent(QEvent *event) && leaveEvent(QEvent *event) 2) Каким образом прикрутить сигнал/слот к иконке "Открыть"/"Очистить", если они выведены через painter.drawPicture вашпе не понятно что ты хочешь спросить. что значит прикрутить сигнал/слот к иконке если иконка выведена с помощью painter.drawPicture ?? Сообщение отредактировал kwisp - 20.7.2009, 18:50 |
|
|
XpycT |
![]()
Сообщение
#3
|
![]() Студент ![]() Группа: Участник Сообщений: 43 Регистрация: 7.7.2009 Пользователь №: 883 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Первый вопрос решен, спасибо.
Цитата(kwisp) вашпе не понятно что ты хочешь спросить. что значит прикрутить сигнал/слот к иконке если иконка выведена с помощью painter.drawPicture ?? Да, слабо объяснил. Я имел в виду что в paintEvent'e я добавил две иконки - на открытие нового рисунка и для очистки. CODE QImage pic_add(":/images/image_add.png"); QImage pic_del(":/images/image_delete.png"); painter.drawImage(rect().width()-pic_add.width()-25, rect().height()-35,pic_add); painter.drawImage(rect().width()-pic_add.width()-5, rect().height()-35,pic_del); Просто не пойму как к этим иконкам прикрутить вызов слотов при клике на них ![]() |
|
|
ufna |
![]()
Сообщение
#4
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 362 Регистрация: 24.5.2008 Из: Курган/СПб Пользователь №: 182 Спасибо сказали: 29 раз(а) Репутация: ![]() ![]() ![]() |
никаких слотов. Обрабатываешь эвент клика мышки, определяешь попал ли пользователь на кнопку, если да, то на какую, в зависимости от этого вызываешь нужную функцию или посылаешь сигнал, который и коннектися к какому-то слоту.
плюс - в маус мув эвенте отлавливать положение мыши на кнопке и рисовать ее другой картинкой (чтобы пользователь знал куда будет давить), и при нажатии - тоже менять картинку. но про слоты и т.п. - первый абзац. |
|
|
XpycT |
![]()
Сообщение
#5
|
![]() Студент ![]() Группа: Участник Сообщений: 43 Регистрация: 7.7.2009 Пользователь №: 883 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Как я понимаю, надо ловить координаты мыши в mousePressEvent и сравнивать, попадают ли они в координаты рисунка-кнопки в paintEvent'a, если да - вызывать действие. Ну и аналогично при движении d mouseMoveEvent для изменения состояния кнопки.
Или я не прав, и есть более простой способ? |
|
|
ufna |
![]()
Сообщение
#6
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 362 Регистрация: 24.5.2008 Из: Курган/СПб Пользователь №: 182 Спасибо сказали: 29 раз(а) Репутация: ![]() ![]() ![]() |
Да, именно так. Кстати, вызывать действие я советую только если пользователь не только нажал на кнопку мыши над этим рисунком-кнопкой, но и отпустил мышь на нем. Проверь - нормальные кнопки под винду именно так и работают. Т.е. в pressEvent ты ловишь нажал ли пользователь эту кнопку, сохраняешь себе в память данные об этом нажатии (как угодно, хоть булевой переменной и т.п.), а в releaseEvent смотришь, была ли кнопка нажата, затем проверяешь попал ли этот эвент на нужный прямоугольник, и если попал, то только тогда вызываешь действие.
а в маус муве то же самое - если кнопка уже нажата, то картинку не меняем. Если не нажата - меняем на "в фокусе" ,если мышка на картинке, а если не на картике - на "не в фокусе". я пользую у себя такой класс на данный момент:
|
|
|
XpycT |
![]()
Сообщение
#7
|
![]() Студент ![]() Группа: Участник Сообщений: 43 Регистрация: 7.7.2009 Пользователь №: 883 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
На счет опускания мыши даже не подумал.. надо будет учесть.
А вот на счет определения позиции мыши над кнопкой. Гдето в исходниках вроде как видел определение самого верхнего рисунка слоя при клике на нем, но не помню толи для пеинтера толи для график виевера, и как на зло не могу вспомнить где ![]()
Можно ли как-то таким способом определить нарисованую кнопку, а то мое условие проверки не очень радует, да и к размеру виджета привязано. Ну или на худой конец хоть упростить его ![]()
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#8
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Можно ли как-то таким способом определить нарисованую кнопку, нет, и называй вещи своими именами, тогда всё встанет на свои места. у тебя нет кнопки, у тебя есть рисунок в одной из частей которого, ты нарисовал, что-то ещё. Следовательно у тебя есть только координаты того, что ты нарисовал.Можешь после рисования куда-нибудь сохранить прямоугольник (QRect), в котором было рисование, потом воспользоваться им, что бы проверять находится ли указатель мыши внутри этого прямоугольника или нет. |
|
|
ufna |
![]()
Сообщение
#9
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 362 Регистрация: 24.5.2008 Из: Курган/СПб Пользователь №: 182 Спасибо сказали: 29 раз(а) Репутация: ![]() ![]() ![]() |
Да, лучше всего работать через QRect в данном случае. У него есть очень удобная функция для проверки принадлежности точки данному прямоугольнику.
|
|
|
XpycT |
![]()
Сообщение
#10
|
![]() Студент ![]() Группа: Участник Сообщений: 43 Регистрация: 7.7.2009 Пользователь №: 883 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Спасибо за советы, думаю разобрался
![]() |
|
|
![]() ![]() ![]() |
![]() |
Текстовая версия | Сейчас: 11.3.2025, 1:53 |