crossplatform.ru

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

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
edwardoid
  опции профиля:
сообщение 29.6.2009, 9:50
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 171
Регистрация: 1.5.2008
Из: Ереван, Армения
Пользователь №: 164

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




Репутация:   0  


Есть идея создать необычное контекстное меню. Скажем нечто вроде:
Link
Как это реализовать? От какого класса наследовать виджет?
QMenu?
Пробовал от QFrame - не получилось. В чем проблема, помогите плз.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 29.6.2009, 10:29
Сообщение #2


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

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

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




Репутация:   94  


Цитата(edwardoid @ 29.6.2009, 13:50) Link
Пробовал от QFrame - не получилось. В чем проблема
таки в чём проблема? Что не получилось?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
edwardoid
  опции профиля:
сообщение 29.6.2009, 10:58
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 171
Регистрация: 1.5.2008
Из: Ереван, Армения
Пользователь №: 164

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




Репутация:   0  


проблема в том, что не смог отобразить, тупо не видно. Я даж не знаю кого сделать ему parent-ом: главное окно или виджет для которого я контекстное меню создаю?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flankerr
  опции профиля:
сообщение 29.6.2009, 15:26
Сообщение #4


Активный участник
***

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

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




Репутация:   0  


Создавай свой класс, наследуйся от того же (как вариант) QDialog. И у тебя полная свобода творчества. Потом лови нажатие правой кнопки грызуна и выводи свой диалог, а скажем если твой диалог теряет фокус ввода то - закрывай диалог. Вот тебе и будет контекстное меню. А парент не особо важен ИМХО, хоть вообще без.

Сообщение отредактировал flankerr - 29.6.2009, 16:55
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
edwardoid
  опции профиля:
сообщение 29.6.2009, 15:32
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 171
Регистрация: 1.5.2008
Из: Ереван, Армения
Пользователь №: 164

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




Репутация:   0  


Цитата(flankerr @ 29.6.2009, 17:26) Link
Создовай свой класс, наследуйся от того же (как вариант) QDialog. И у тебя полная свобода творчества. Потом лови нажатие правой кнопки грызуна и выводи свой диалог, а скажем если твой диалог теряет фокус ввода то - закрывай диалог. Вот тебе и будет контекстное меню. А парент не особо важен ИМХО, хоть вообще без.

А как его передвинуть на нужно место?
QDialog::move() не помогает.
И плюс не знаю как уследить за тем, что он потерял фокус

Сообщение отредактировал edwardoid - 29.6.2009, 15:34
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 29.6.2009, 15:55
Сообщение #6


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

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

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




Репутация:   9  


Если не задавать родителя, то меню будет плавать в своем окне. Можно отключить ему декорации и вывести поверх всех окон. Перемещение о проверка потери фокуса не проблема. Но есть одно но - при выводе меню главное окно становится неактивным... Если это устраивает, то могу выложить свои наброски.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
edwardoid
  опции профиля:
сообщение 29.6.2009, 15:58
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 171
Регистрация: 1.5.2008
Из: Ереван, Армения
Пользователь №: 164

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




Репутация:   0  


в любом случае выложи пожалуйста, покопаюсь в них, мож и так пойдет
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 29.6.2009, 16:10
Сообщение #8


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

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

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




Репутация:   9  


Чуть-чуть поправил, теперь работает как надо. Только лень делать весь API для динамического добавления/удаления кнопок, смены их картинок и т.д. Также, хоть я и сделал производный от QPushButton класс, я не стал с ним пока ничего делать. Но он может понадобиться потом, например, в конструкторе можно забить начальные размеры и т.д. Может быть когда-нибудь потом доделаю, если настроение будет :)

Сообщение отредактировал Kagami - 29.6.2009, 16:11
Прикрепленные файлы
Прикрепленный файл  contextMenu.zip ( 2.17 килобайт ) Кол-во скачиваний: 154
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flankerr
  опции профиля:
сообщение 29.6.2009, 16:54
Сообщение #9


Активный участник
***

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

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




Репутация:   0  


Цитата(Kagami @ 29.6.2009, 16:55) Link
Но есть одно но - при выводе меню главное окно становится неактивным...
Правельно. Как при выводе любого модального диалога. А вот если его сделать не модальным то возможно и это можно обойти - надо ради интереса попробывать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 29.6.2009, 17:11
Сообщение #10


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

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

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




Репутация:   9  


Я это дело уже обошел с помощью флагов окна. Qt::Popup то что надо в данном случае

UPD: Если заменить QWidget на QFrame для меню, то можно сделать рамку. Что-то я сразу об этом не подумал

Сообщение отредактировал Kagami - 29.6.2009, 17:24
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
edwardoid
  опции профиля:
сообщение 29.6.2009, 17:33
Сообщение #11


Участник
**

Группа: Участник
Сообщений: 171
Регистрация: 1.5.2008
Из: Ереван, Армения
Пользователь №: 164

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




Репутация:   0  


Спасибо, все работает окромя того, что меню появляется непонятно где.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 29.6.2009, 17:36
Сообщение #12


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

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

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




Репутация:   9  


Хм.. у меня появляется точно в месте клика

UPD: новая версия с использованием QFrame

Сообщение отредактировал Kagami - 29.6.2009, 17:42
Эскизы прикрепленных изображений
 Р В Р’ Р’ Р’ Р в‚¬Р В РЎВ˜Р В Р’µР Р…ьшено Р Т‘Р С• 67%
Прикрепленное изображение
800 x 600 (72.97 килобайт)
 

Прикрепленные файлы
Прикрепленный файл  contextMenu.zip ( 2.29 килобайт ) Кол-во скачиваний: 125
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
IMPOMEZIA
  опции профиля:
сообщение 29.6.2009, 17:55
Сообщение #13


Студент
*

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

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




Репутация:   0  


По идее нужно использовать QWidgetAction для добавления своего виджета в QMenu.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 29.6.2009, 18:00
Сообщение #14


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

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

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




Репутация:   9  


Проблема в том, как в таком случае располагать виджеты в произвольном порядке, например, в сетке 3х3.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
edwardoid
  опции профиля:
сообщение 29.6.2009, 18:05
Сообщение #15


Участник
**

Группа: Участник
Сообщений: 171
Регистрация: 1.5.2008
Из: Ереван, Армения
Пользователь №: 164

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




Репутация:   0  


Цитата(Kagami @ 29.6.2009, 19:36) Link
Хм.. у меня появляется точно в месте клика

UPD: новая версия с использованием QFrame

Странно... у меня пришлось :
CODE
menu->move(mapToGlobal(QPoint(point.x()+15,point.y()+70)));
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 29.6.2009, 19:03
Сообщение #16


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

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

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




Репутация:   9  


Какая у тебя ось? И версия Qt?
P.S. У кого-нибудь еще есть проблемы с неправильным позиционированием меню?
P.P.S. Собрал пример в дебиане, все работает правильно

Сообщение отредактировал Kagami - 29.6.2009, 19:11
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
IMPOMEZIA
  опции профиля:
сообщение 29.6.2009, 19:24
Сообщение #17


Студент
*

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

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




Репутация:   0  


Цитата(Kagami @ 29.6.2009, 19:00) Link
Проблема в том, как в таком случае располагать виджеты в произвольном порядке, например, в сетке 3х3.

Точно также как и сейчас, только не нужно заботиться о координатах меню.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
edwardoid
  опции профиля:
сообщение 29.6.2009, 19:40
Сообщение #18


Участник
**

Группа: Участник
Сообщений: 171
Регистрация: 1.5.2008
Из: Ереван, Армения
Пользователь №: 164

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




Репутация:   0  


Цитата(Kagami @ 29.6.2009, 21:03) Link
Какая у тебя ось? И версия Qt?
P.S. У кого-нибудь еще есть проблемы с неправильным позиционированием меню?
P.P.S. Собрал пример в дебиане, все работает правильно

Windows 7, Qt 4.5.2


IMPOMEZIA , eсть примеры кстати насчет QWidgetAction?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
IMPOMEZIA
  опции профиля:
сообщение 29.6.2009, 23:58
Сообщение #19


Студент
*

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

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




Репутация:   0  


Цитата(edwardoid @ 29.6.2009, 20:40) Link
IMPOMEZIA , eсть примеры кстати насчет QWidgetAction?


Примерно так:
void MyWidget::contextMenuEvent(QContextMenuEvent *event)
{
  QMenu menu(this);
  QLabel *myCustomWidget = new QLabel(tr("test"), &menu);

  QWidgetAction *action = new QWidgetAction(&menu);
  action->setDefaultWidget(myCustomWidget);

  menu.addAction(action);
  menu.exec(event->globalPos());
}


Что за виджет будет myCustomWidget целиком ваша забота, QWidgetAction это всего лишь способ разместить его в меню.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 30.6.2009, 4:27
Сообщение #20


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

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

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




Репутация:   94  


насколько я помню обсуждение с прог.орга, в таком случае нужно выделение элементов меню самому рисовать.
Т.е. в штатном меню, при перемещении мышки над меню мы видим как выделяются пункты меню.
А в случае с собственными виджетами, это выделение нужно будет рисовать самим

edwardoid, я думаю стоит ещё статью из ежеквартальника Qt глянуть: Link
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 30.6.2009, 9:05
Сообщение #21


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Цитата(Litkevich Yuriy @ 30.6.2009, 5:27) Link
насколько я помню обсуждение с прог.орга, в таком случае нужно выделение элементов меню самому рисовать.
Т.е. в штатном меню, при перемещении мышки над меню мы видим как выделяются пункты меню.
А в случае с собственными виджетами, это выделение нужно будет рисовать самим

edwardoid, я думаю стоит ещё статью из ежеквартальника Qt глянуть: Link


Это было в теме про разный размер иконок в QMenu, я тогда предложил использовать QWidgetAction, вместо того, чтобы писать свой стиль. Но ведь никто не заставляет рисовать выделение, если оно ненужно в принципе.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
edwardoid
  опции профиля:
сообщение 30.6.2009, 10:12
Сообщение #22


Участник
**

Группа: Участник
Сообщений: 171
Регистрация: 1.5.2008
Из: Ереван, Армения
Пользователь №: 164

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 30.6.2009, 6:27) Link
насколько я помню обсуждение с прог.орга, в таком случае нужно выделение элементов меню самому рисовать.
Т.е. в штатном меню, при перемещении мышки над меню мы видим как выделяются пункты меню.
А в случае с собственными виджетами, это выделение нужно будет рисовать самим

edwardoid, я думаю стоит ещё статью из ежеквартальника Qt глянуть: Link




Litkevich Yuriy, вариант предложенный Kagami работает превосходно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 13.8.2025, 16:10