![]() |
|
![]() ![]() ![]() |
|
NewDima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
Как вы привязываете к отдельным итемам ItemWidget-ов и ItemView-ов popup-менюшки, если для разных итемов нужны разные меню?
Я сначала решил использовать какой-то странный свой велосипед, при создании итема в данные ему ему добавляю адрес экземпляра менюшки, либо 0, если нет ассоциации, а на customContextMenuRequested-е делаю так
Решение мне кажется естественно грязным, какой порядок предусматривался создателями qt и что вы считаете более удобным? Пользуюсь qtcreator3.1 |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
Я использую не менее "грязный", как мне кажется, способ:
каждому индексу присваиваю widget, устанавливаю contextMenuPolicy = Qt::ActionsContextMenu и добавляю в созданный widget action'ы
мне этот способ также не нравится, поэтому вместе с NewDima буду ждать других вариантов P.S. Модераторам: У меня в Opera 10.00 (winXP) не работает подсветка синтаксиса, хотя указано code=cpp в квадратных скобках Это сообщение отредактировал(а) borisbn - 22.2.2010, 08:33 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Изначально я использовал метод основанный на регистрации своих типов: qRegisterMetaType(), QVariant со своим типом и тоже помещал в Qt::UserRole. При вызове контекстного меню я проверял тип через bool QVariant::canConvert ( Type t ) const. Однако позже, когда количество типов перевалило за 20 я осознал, что код на вид получился очень неприглядным, однотипным и длинным как портянка. Позже я уже подумывал о более простом варианте с enum{}, а сейчас думаю над полиморфным вариантом наследования от QStandardItem. Т.е. общий интерфейс, например метод MyCustomItem::menu(), который возвращает указатель на меню для типа этого класса. Соответственно нужно переопределять виртуальный метод, который будет вызывать оригинальный метод базового класса для получения меню общего для всех итемов и затем добавлять к нему новые элементы, специфичные именно для типа производного класса. Как вариант список QList<QAction *> можно сделать статическим членом, чтобы он был общий для всех экземпляров MyCustomItem (но это не лучшая идея, объясню ниже). В итоге таких списков будет 2, один для базового класса, второй для конкретного типа. Меню будет создаваться динамически, при этом в QAction::setData() можно поместить QModelIndex() итема над которым было вызвано контекстное меню, чтобы избавиться от необходимости вычислять от проверки какой итем сейчас выделен в QAbstractItemView. Однако также следует учесть поведение меню при выделении сразу нескольких разнотипных итемов. То есть в методе MyCustomItem::menu() нужно получить указатель на QItemSelectionModel и определить поведение меню в следующих ситуациях:
- currentIndex() (итем над которым вызывается меню) не имеет выделения (запросто), один или более элементов имеют выделение или не имеют вообще - currentIndex() выделен вместе с другими итемами - выделена одна строка (10 разнотипных итемов на 10 колонок) (currentIndex() может не входить в это выделение) - выделена одна строка (пользователь сделал клик по каждому элементу в строке с зажатым control'ом) и выбраны одиночные элементы других строк - выделено несколько строк (QAbstractItemView::SelectionBehavior SelectRows) То есть нужно определиться какая операция будет выполняться в различных условиях. Операция над одним итемом, операция над целой строкой, операция над колонкой, операция над 10 итемами, которые можно рассматривать либо по отдельности каждый, либо считать строкой. Операция над несколькими строками. Или только операция над текущим итемом, который может быть даже не выделен, максимум что иметь это пунктирный прямоугольник фокуса. В зависимости от всего этого формировать меню со своим набором операций. Например не во всех случаях может быть применимо общее меню для всех итемов, поэтому базовый метод вызывать даже нет смысла и нужно формировать меню с нуля или формировать экземпляры меню на все случаи жизни и делать их статическими членами. Думаю правильней все-таки генерить меню на лету. |
|||
|
||||
NewDima |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 922 Регистрация: 20.2.2006 Где: <?here?> Репутация: нет Всего: 12 |
SABROG, спасибо, есть над чем подумать
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |