![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
edwardoid |
![]() ![]()
Сообщение
#1
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 171 Регистрация: 1.5.2008 Из: Ереван, Армения Пользователь №: 164 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Есть идея создать необычное контекстное меню. Скажем нечто вроде:
Link Как это реализовать? От какого класса наследовать виджет? QMenu? Пробовал от QFrame - не получилось. В чем проблема, помогите плз. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#2
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(edwardoid @ 29.6.2009, 13:50) Link Пробовал от QFrame - не получилось. В чем проблема таки в чём проблема? Что не получилось?
|
|
|
edwardoid |
![]()
Сообщение
#3
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 171 Регистрация: 1.5.2008 Из: Ереван, Армения Пользователь №: 164 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
проблема в том, что не смог отобразить, тупо не видно. Я даж не знаю кого сделать ему parent-ом: главное окно или виджет для которого я контекстное меню создаю?
|
|
|
flankerr |
![]()
Сообщение
#4
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
Создавай свой класс, наследуйся от того же (как вариант) QDialog. И у тебя полная свобода творчества. Потом лови нажатие правой кнопки грызуна и выводи свой диалог, а скажем если твой диалог теряет фокус ввода то - закрывай диалог. Вот тебе и будет контекстное меню. А парент не особо важен ИМХО, хоть вообще без.
Сообщение отредактировал flankerr - 29.6.2009, 16:55 |
|
|
edwardoid |
![]()
Сообщение
#5
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 171 Регистрация: 1.5.2008 Из: Ереван, Армения Пользователь №: 164 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(flankerr @ 29.6.2009, 17:26) Link Создовай свой класс, наследуйся от того же (как вариант) QDialog. И у тебя полная свобода творчества. Потом лови нажатие правой кнопки грызуна и выводи свой диалог, а скажем если твой диалог теряет фокус ввода то - закрывай диалог. Вот тебе и будет контекстное меню. А парент не особо важен ИМХО, хоть вообще без. А как его передвинуть на нужно место? QDialog::move() не помогает. И плюс не знаю как уследить за тем, что он потерял фокус Сообщение отредактировал edwardoid - 29.6.2009, 15:34 |
|
|
Kagami |
![]()
Сообщение
#6
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: ![]() ![]() ![]() |
Если не задавать родителя, то меню будет плавать в своем окне. Можно отключить ему декорации и вывести поверх всех окон. Перемещение о проверка потери фокуса не проблема. Но есть одно но - при выводе меню главное окно становится неактивным... Если это устраивает, то могу выложить свои наброски.
|
|
|
edwardoid |
![]()
Сообщение
#7
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 171 Регистрация: 1.5.2008 Из: Ереван, Армения Пользователь №: 164 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
в любом случае выложи пожалуйста, покопаюсь в них, мож и так пойдет
|
|
|
Kagami |
![]()
Сообщение
#8
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: ![]() ![]() ![]() |
Чуть-чуть поправил, теперь работает как надо. Только лень делать весь API для динамического добавления/удаления кнопок, смены их картинок и т.д. Также, хоть я и сделал производный от QPushButton класс, я не стал с ним пока ничего делать. Но он может понадобиться потом, например, в конструкторе можно забить начальные размеры и т.д. Может быть когда-нибудь потом доделаю, если настроение будет
![]() Сообщение отредактировал Kagami - 29.6.2009, 16:11
Прикрепленные файлы
|
|
|
flankerr |
![]()
Сообщение
#9
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(Kagami @ 29.6.2009, 16:55) Link Но есть одно но - при выводе меню главное окно становится неактивным... Правельно. Как при выводе любого модального диалога. А вот если его сделать не модальным то возможно и это можно обойти - надо ради интереса попробывать.
|
|
|
Kagami |
![]()
Сообщение
#10
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: ![]() ![]() ![]() |
Я это дело уже обошел с помощью флагов окна. Qt::Popup то что надо в данном случае
UPD: Если заменить QWidget на QFrame для меню, то можно сделать рамку. Что-то я сразу об этом не подумал Сообщение отредактировал Kagami - 29.6.2009, 17:24 |
|
|
edwardoid |
![]()
Сообщение
#11
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 171 Регистрация: 1.5.2008 Из: Ереван, Армения Пользователь №: 164 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Спасибо, все работает окромя того, что меню появляется непонятно где.
|
|
|
Kagami |
![]()
Сообщение
#12
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: ![]() ![]() ![]() |
Хм.. у меня появляется точно в месте клика
UPD: новая версия с использованием QFrame Сообщение отредактировал Kagami - 29.6.2009, 17:42
Эскизы прикрепленных изображений
Прикрепленные файлы
|
|
|
IMPOMEZIA |
![]()
Сообщение
#13
|
![]() Студент ![]() Группа: Участник Сообщений: 42 Регистрация: 18.2.2009 Пользователь №: 560 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
По идее нужно использовать QWidgetAction для добавления своего виджета в QMenu.
|
|
|
Kagami |
![]()
Сообщение
#14
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: ![]() ![]() ![]() |
Проблема в том, как в таком случае располагать виджеты в произвольном порядке, например, в сетке 3х3.
|
|
|
edwardoid |
![]()
Сообщение
#15
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 171 Регистрация: 1.5.2008 Из: Ереван, Армения Пользователь №: 164 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(Kagami @ 29.6.2009, 19:36) Link Хм.. у меня появляется точно в месте клика UPD: новая версия с использованием QFrame Странно... у меня пришлось : CODE menu->move(mapToGlobal(QPoint(point.x()+15,point.y()+70)));
|
|
|
Kagami |
![]()
Сообщение
#16
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: ![]() ![]() ![]() |
Какая у тебя ось? И версия Qt?
P.S. У кого-нибудь еще есть проблемы с неправильным позиционированием меню? P.P.S. Собрал пример в дебиане, все работает правильно Сообщение отредактировал Kagami - 29.6.2009, 19:11 |
|
|
IMPOMEZIA |
![]()
Сообщение
#17
|
![]() Студент ![]() Группа: Участник Сообщений: 42 Регистрация: 18.2.2009 Пользователь №: 560 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(Kagami @ 29.6.2009, 19:00) Link Проблема в том, как в таком случае располагать виджеты в произвольном порядке, например, в сетке 3х3. Точно также как и сейчас, только не нужно заботиться о координатах меню. |
|
|
edwardoid |
![]()
Сообщение
#18
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 171 Регистрация: 1.5.2008 Из: Ереван, Армения Пользователь №: 164 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(Kagami @ 29.6.2009, 21:03) Link Какая у тебя ось? И версия Qt? P.S. У кого-нибудь еще есть проблемы с неправильным позиционированием меню? P.P.S. Собрал пример в дебиане, все работает правильно Windows 7, Qt 4.5.2 IMPOMEZIA , eсть примеры кстати насчет QWidgetAction? |
|
|
IMPOMEZIA |
![]()
Сообщение
#19
|
![]() Студент ![]() Группа: Участник Сообщений: 42 Регистрация: 18.2.2009 Пользователь №: 560 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(edwardoid @ 29.6.2009, 20:40) Link IMPOMEZIA , eсть примеры кстати насчет QWidgetAction? Примерно так:
Что за виджет будет myCustomWidget целиком ваша забота, QWidgetAction это всего лишь способ разместить его в меню. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#20
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
насколько я помню обсуждение с прог.орга, в таком случае нужно выделение элементов меню самому рисовать.
Т.е. в штатном меню, при перемещении мышки над меню мы видим как выделяются пункты меню. А в случае с собственными виджетами, это выделение нужно будет рисовать самим edwardoid, я думаю стоит ещё статью из ежеквартальника Qt глянуть: Link |
|
|
SABROG |
![]()
Сообщение
#21
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(Litkevich Yuriy @ 30.6.2009, 5:27) Link насколько я помню обсуждение с прог.орга, в таком случае нужно выделение элементов меню самому рисовать. Т.е. в штатном меню, при перемещении мышки над меню мы видим как выделяются пункты меню. А в случае с собственными виджетами, это выделение нужно будет рисовать самим edwardoid, я думаю стоит ещё статью из ежеквартальника Qt глянуть: Link Это было в теме про разный размер иконок в QMenu, я тогда предложил использовать QWidgetAction, вместо того, чтобы писать свой стиль. Но ведь никто не заставляет рисовать выделение, если оно ненужно в принципе. |
|
|
edwardoid |
![]()
Сообщение
#22
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 171 Регистрация: 1.5.2008 Из: Ереван, Армения Пользователь №: 164 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Цитата(Litkevich Yuriy @ 30.6.2009, 6:27) Link насколько я помню обсуждение с прог.орга, в таком случае нужно выделение элементов меню самому рисовать. Т.е. в штатном меню, при перемещении мышки над меню мы видим как выделяются пункты меню. А в случае с собственными виджетами, это выделение нужно будет рисовать самим edwardoid, я думаю стоит ещё статью из ежеквартальника Qt глянуть: Link Litkevich Yuriy, вариант предложенный Kagami работает превосходно. |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 13.8.2025, 16:10 |