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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не работают горячие клавиши при скрытии меню  (Прочитано 7632 раз)
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« : Декабрь 06, 2013, 09:54 »

В полноэкранном режиме меню автоматически скрывается (показывается при подводе к границе указателя мыши). Когда меню видно - горячие клавиши работают, когда меню скрыто - не работают.
Записан
Bepec
Гость
« Ответ #1 : Декабрь 06, 2013, 10:03 »

У шорткаров какая область видимости? Qt::ShortcutContext в смысле.
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #2 : Декабрь 06, 2013, 10:10 »

У меня через QAction сделанно
Код:
MainWindow::MainWindow() {
actVec[i] = new QAction(actList[i], this);
actVec[i]->setShortcut(actList[i]);
menu[i]->addAction(actVec[k]);
}
На QShortcut переписать? Но если actVec->setShortcut удалить, пропадут подсказки к пунктам меню. Если оставить, то при показе меню надо блокировать QShortcut. Как то костыльно получается, нельзя ли вызывать QAction для скрытого меню?
« Последнее редактирование: Декабрь 06, 2013, 10:27 от deMax » Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #3 : Декабрь 06, 2013, 10:33 »

Хотя все придумал. В QAction не коннектить, а QShortCut соединить.
только пишет (когда они оба включены)
Warning: QAction::eventFilter: Ambiguous shortcut overload: Ctrl+F

приходиться при показе меню shortcut отключать, при скрытии включать. Криво, но работает.
« Последнее редактирование: Декабрь 06, 2013, 11:38 от deMax » Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #4 : Декабрь 06, 2013, 11:43 »

сталкивался с такой же проблемой. решал созданием шорткара
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #5 : Декабрь 10, 2013, 13:54 »

Fregloin, так я и создал QShortcut. Просто чтобы в меню показывались комбинации клавиш, пришлось QAction комбинацию назначить. Но тогда при видимом меню получается 2 комбинации и ни одна не работает, приходится отключать QShortcut.
Записан
Bepec
Гость
« Ответ #6 : Декабрь 10, 2013, 16:53 »

Qmenu можно назначить уже существующий шорткар.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #7 : Декабрь 13, 2013, 09:58 »

поподробнее пожалуйста, я искал но не нашёл.
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #8 : Декабрь 17, 2013, 07:17 »

Цитировать
поподробнее пожалуйста, я искал но не нашёл.
присоединяюсь к просьбе.
Записан
Bepec
Гость
« Ответ #9 : Декабрь 17, 2013, 10:58 »

Ошибся однако. Нет там такого.

Наскидку вот вам абзац из assistant

Цитировать
Warning: You should not normally need to use this function since Qt's shortcut system enables/disables shortcuts automatically as widgets become hidden/visible and gain or lose focus. It is best to use QAction or QShortcut to handle shortcuts, since they are easier to use than this low-level function.

Это заслуга QMenu системы шорткатов Qt. При скрытии виджета, она убивает реакцию. мм... Ещё посмотрю.
« Последнее редактирование: Декабрь 17, 2013, 11:15 от Bepec » Записан
Bepec
Гость
« Ответ #10 : Декабрь 17, 2013, 12:59 »

В принципе как я и говорил, это заслуга системы шорткаров Qt. (верно для версии 4.7.2)

В самом шорткаре содержится следующая структура:


Клавиша, контекст, enabled, autorepeat, id и ... owner - родитель шорткара.

По нижеследующему коду проверяется следующее -
Контекст шорткара (context), виджет, который привязан к шорткару(owner) и активное окно приложения Улыбающийся


Если родитель невидим или отключен - мы убиваем шорткар... В общем то это и есть ответ на ваш вопрос - почему не работает. Потому что такая логика заложена в систему шорткаров Qt при использовании QAction.

Решением проблемы будут QShortcut с родителем в виде главного окна приложения. Правда остаётся проблема надписей, но тут я умываю руки - итак покопался Веселый


Код:
bool QShortcutMap::correctWidgetContext(Qt::ShortcutContext context, QWidget *w, QWidget *active_window) const
{
    bool visible = w->isVisible();    
#ifdef Q_WS_MAC
    if (!qApp->testAttribute(Qt::AA_DontUseNativeMenuBar) && qobject_cast<QMenuBar *>(w))
        visible = true;
#endif

    if (!visible || !w->isEnabled())
        return false;

    if (context == Qt::ApplicationShortcut)
        return QApplicationPrivate::tryModalHelper(w, 0); // true, unless w is shadowed by a modal dialog

    if (context == Qt::WidgetShortcut)
        return w == QApplication::focusWidget();

    if (context == Qt::WidgetWithChildrenShortcut) {
        const QWidget *tw = QApplication::focusWidget();
        while (tw && tw != w && (tw->windowType() == Qt::Widget || tw->windowType() == Qt::Popup))
            tw = tw->parentWidget();
        return tw == w;
    }

PS уфф...

PPS я так и не нашёл где напрямую написано это в Assistant, но я думаю что таие строки там есть.
« Последнее редактирование: Декабрь 17, 2013, 17:05 от Bepec » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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