Russian Qt Forum
Ноябрь 24, 2024, 13:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Добавление кастомных экшенов в контекстное меню QLineEdit, QSpinBox, QComboBox  (Прочитано 4366 раз)
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« : Сентябрь 10, 2010, 11:04 »

Собственно вопрос: как правильно это делать?

Пока делаю через QLineEdit::createStandardContextMenu. То есть зову createStandardContextMenu, добавляю туда свои экшены и показываю его вместо стандартного. Но есть пара проблем при этом:
  • почему-то стандартные экшены перестают обновлять свой enable статус, например, выделил текст, а "copy to clipboard" заблокировано по прежнему
  • в QSpinBox довольно сложно добраться до QLineEdit (protected свойство) пришлось его хакать через наследника.. И спинбокс сам добавляет свои экшены в конец меню, которых нет по createStandardContextMenu

Вот. Как еще можно добавиться в контекстное меню?
Записан

Гугль в помощь
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #1 : Сентябрь 10, 2010, 12:39 »

По доброй традиции отвечаю себе сам )

Заглянул в исходники QAbstractSpinBox.. в общем, так и есть берут меню createStandardContextMenu и втыкают туда свои 3 экшена...

Единственный нюанс, который решает мою первую проблему - это надо перед каждым показом меню, его запрашивать а не пытаться его держать.

В итоге код получается примерно такой (для QLineEdit):

Код
C++ (Qt)
...
 
// initialization somewhere
edit_ = new QLineEdit;
edit_->setContextMenuPolicy(Qt::CustomContextMenu);
connect(edit_, SIGNAL(customContextMenuRequested(const QPoint&)),
   SLOT(custom_context_menu_requested(const QPoint&)));
...
 
// show context menu
void string_prop_toolbar_editor::custom_context_menu_requested(const QPoint & pos)
{
   QPointer<QMenu> menu = edit_->createStandardContextMenu();
 
   QAction* first = menu->actions().first();
 
   menu->insertAction(first, header_action);
   menu->insertAction(first, properties_action);
   menu->insertAction(first, reset_to_default_action);
   menu->insertSeparator(first);
   menu->exec(edit_->mapToGlobal(pos));
 
   delete static_cast<QMenu *>(menu);
}
 
Записан

Гугль в помощь
blindvic
Гость
« Ответ #2 : Декабрь 18, 2010, 12:20 »

У меня при таком подходе сбрасывается имеющееся выделение текста.
Видимо надо переопределить mouseReleaseEvent, но тогда уже и нажатие кнопки контекстного меню тоже следует перехватить.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.098 секунд. Запросов: 22.