Поиск:

Ответ в темуСоздание новой темы Создание опроса
> popup на итемы виджетов, на каждый итем разный popup 
:(
    Опции темы
NewDima
Дата 22.2.2010, 05:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



Как вы привязываете к отдельным итемам ItemWidget-ов и ItemView-ов popup-менюшки, если для разных итемов нужны разные меню?
Я сначала решил использовать какой-то странный свой велосипед, при создании итема в данные ему ему добавляю адрес экземпляра менюшки, либо 0, если нет ассоциации, а на customContextMenuRequested-е делаю так
Код

    QModelIndex index = ui->twProjectTree->currentIndex();
    QMenu *menu = reinterpret_cast<QMenu*>(index.data(Qt::UserRole).toInt());
    if (!menu) return;
    menu->popup(...
 
Решение мне кажется естественно грязным, какой порядок предусматривался создателями qt и что вы считаете более удобным?
Пользуюсь qtcreator3.1
PM ICQ   Вверх
borisbn
Дата 22.2.2010, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Я использую не менее "грязный", как мне кажется, способ:
каждому индексу присваиваю widget, устанавливаю contextMenuPolicy = Qt::ActionsContextMenu и добавляю в созданный widget action'ы
Код

QLabel * label = new QLabel( ... );
label->setAutoFillBackground( true );
itemView->setIndexWidget( index, label );
label->setContextMenuPolicy( Qt::ActionsContextMenu );
for ( ... )
{
    QAction * action = new QAction( ... );
    connect( action, SIGNAL( triggered() ), SLOT( слот )  );
    label->addAction( action );
}

мне этот способ также не нравится, поэтому вместе с NewDima буду ждать других вариантов 

P.S. Модераторам: У меня в Opera 10.00 (winXP) не работает подсветка синтаксиса, хотя указано code=cpp в квадратных скобках

Это сообщение отредактировал(а) borisbn - 22.2.2010, 08:33


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
SABROG
Дата 22.2.2010, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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 итемами, которые можно рассматривать либо по отдельности каждый, либо считать строкой. Операция над несколькими строками. Или только операция над текущим итемом, который может быть даже не выделен, максимум что иметь это пунктирный прямоугольник фокуса. В зависимости от всего этого формировать меню со своим набором операций. Например не во всех случаях может быть применимо общее меню для всех итемов, поэтому базовый метод вызывать даже нет смысла и нужно формировать меню с нуля или формировать экземпляры меню на все случаи жизни и делать их статическими членами. Думаю правильней все-таки генерить меню на лету.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
NewDima
Дата 23.2.2010, 07:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



SABROG, спасибо, есть над чем подумать
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1127 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.