Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Qt: два QMenu на разных виджетах, с пунктами с одинак. сочетанием клавиш 
:(
    Опции темы
qasker
Дата 23.4.2013, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 22.4.2013

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



На форме есть виджеты QLabel, QTableWidget.
По нажатию правой кнопки мыши требуется всплывающее меню -
свое для каждого виджета. Но в меню для label должен быть
пункт типа "Копировать влево    Ctrl+C", а в меню для table -
"Копировать вправо      Ctrl+C".
Ключевое здесь - сочетания клавиш для обоих пунктов одинаковые.
Т.е. нажатие Ctrl+C должно вызывать действие из "своего" меню
(находящегося в фокусе).
Меню реализовал, при выборе пунктов меню мышкой происходит то,
что нужно. А вот сочетание клавиш не работает, если QShortcut Ctrl+C
установлен обоим виджетам. Если какому-то одному - то работает.

Как-то проблема решается? Элементарная же вещь.
Хотя бы общая идея. В Builder все парой кликов в редакторе форм
решалось...

Неужели отлавливать нажатия клавиш отдельно, узнавать, над каким виджетом курсор? 0-:

Qt версия 4.8.

.h :
Код

class mainform : public QMainWindow // форма в основном сделана в Qt Designer
{
  Q_OBJECT

  //...


  private:

    QMenu* menu1;
    QAction *actionCopy1;

    QMenu* menu2;
    QAction *actionCopy2;

  // ...

  private slots:

    void do1();
    void do2();
}


.cpp:

Код

mainform::mainform(/*...*/)
{
  ui.setupUi(this);
  // ...
 

  menu1 = new QMenu("menu1", ui.table);
  menu2 = new QMenu("menu2", ui.label);

  QKeySequence ks;

  
  ks = Qt::CTRL + Qt::Key_C;
  actionCopy1 = new QAction("Copy1", ui.table);
  QShortcut* sc1 = new QShortcut(ui.table);
  sc1->setKey(ks);
  QObject::connect(sc1, SIGNAL(activated()), this, SLOT(do1()));
  actionCopy1->setShortcut(ks);
  QObject::connect(actionCopy1, SIGNAL(triggered()), this, SLOT(do1()));  
  menu1->addAction(actionCopy1);

  ks = Qt::CTRL + Qt::Key_C; // то же сочетание клавиш
  actionCopy2 = new QAction("Copy2", ui.label);
  QShortcut* sc2 = new QShortcut(ui.label);
  sc2->setKey(ks);
  QObject::connect(sc2, SIGNAL(activated()), this, SLOT(do2()));
  actionCopy2->setShortcut(ks);
  QObject::connect(actionCopy2, SIGNAL(triggered()), this, SLOT(do2()));  
  menu2->addAction(actionCopy2);

  QObject::connect(ui.table, SIGNAL(customContextMenuRequested(const QPoint &)), 
                   this,     SLOT(showContextMenuForTable(const QPoint &)));

  QObject::connect(ui.label, SIGNAL(customContextMenuRequested(const QPoint &)), 
                   this,     SLOT(showContextMenuForLabel(const QPoint &)));


}

void mainform::showContextMenuForTable(const QPoint &pos)
{
  menu1->exec(ui.table->viewport()->mapToGlobal(pos));
}

void mainform::showContextMenuForLabelconst QPoint &pos)
{
  menu2->exec(ui.label->viewport()->mapToGlobal(pos));
}

void mainform::do1()
{
  // не вызывается по Ctrl+C :(

  // но вызывается по клику мышкой в пункт меню
}

void mainform::do2()
{
  // не вызывается по Ctrl+C :(

  // но вызывается по клику мышкой
}

PM MAIL   Вверх
Jeka178RUS
Дата 23.4.2013, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 3.9.2012

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



PM MAIL   Вверх
qasker
Дата 23.4.2013, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 22.4.2013

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



Да, помогло, отчасти.
Код

sc1->setContext(Qt::WidgetShortcut);
sc2->setContext(Qt::WidgetShortcut);
// и на всякий случай:
actTionCopy1->setShortcutContext(Qt::WidgetShortcut);
actTionCopy2->setShortcutContext(Qt::WidgetShortcut);

Но вызывается в итоге все равно do1();
В ней конечно можно получить имя виджета и если надо, вызывать do2();
Но как-то сложно и некраиво...

А еще, что грустнее, при table не enabled() сочетание Ctrl+C не срабатывает на lable :(
Что логично, ведь при текущих раскладах подконнекчена только do1()...

Это сообщение отредактировал(а) qasker - 23.4.2013, 13:50
PM MAIL   Вверх
Jeka178RUS
Дата 23.4.2013, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 3.9.2012

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



Пробовал Qt::WidgetWithChildrenShortcut?
PM MAIL   Вверх
qasker
Дата 23.4.2013, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 22.4.2013

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



Попробовал, то же самое.

Не понимаю, я указал в конструкторах шорткатов конкретные виджеты. А do1() вызывается и при нажатии сочетания клавиш и с курсором поверх других виджетов.

Эх, наверно надо делать глобальный шорткат и в его обрботчике определять виджет.
PM MAIL   Вверх
Jeka178RUS
Дата 23.4.2013, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 3.9.2012

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



То что курсор поверх виджета еще не значит что у него фокус smile проверь для начала кто и когда фокус получает
PM MAIL   Вверх
qasker
Дата 23.4.2013, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 22.4.2013

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



Да, когда кликнул в ячейку таблицы, перенести из нее фокус, кликая на label, не получается.
Сделал "узнвание", где курсор:
Код

do1()
{
  QPoint p = QCursor::pos(); 
  QWidget* w = qApp->widgetAt(p);
  if (!w) return; // вне окна приложения
  QString name = w->objectName(); 
  if (name == "label")
  {
     do2();
     return;
  }

  if (name == "THIS_IS_TABLE_CELL" || name == "qt_scrollarea_viewport")
  //  THIS_IS_TABLE_CELL - так называю ячейки при их создании в таблице;
  //  qt_scrollarea_viewport - так, оказалось, называются незаполненные ячейки;
  {
     // делаем то, что надо было в do1()
 
  }



 smile   smile 
P.S. В QT начал работать недавно, пока из-за неопытности вот бесят все эти костыли жуткие. Может, всё делается проще, но например у Шлее такой заковыки вроде не было.
PM MAIL   Вверх
Jeka178RUS
Дата 23.4.2013, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 3.9.2012

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



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

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

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


 




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


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

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