Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: deMax от Декабря 06, 2013, 09:54



Название: Не работают горячие клавиши при скрытии меню
Отправлено: deMax от Декабря 06, 2013, 09:54
В полноэкранном режиме меню автоматически скрывается (показывается при подводе к границе указателя мыши). Когда меню видно - горячие клавиши работают, когда меню скрыто - не работают.


Название: Re: Не работают горячие клавиши при скрытии меню
Отправлено: Bepec от Декабря 06, 2013, 10:03
У шорткаров какая область видимости? Qt::ShortcutContext в смысле.


Название: Re: Не работают горячие клавиши при скрытии меню
Отправлено: deMax от Декабря 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 для скрытого меню?


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

приходиться при показе меню shortcut отключать, при скрытии включать. Криво, но работает.


Название: Re: Не работают горячие клавиши при скрытии меню
Отправлено: Fregloin от Декабря 06, 2013, 11:43
сталкивался с такой же проблемой. решал созданием шорткара


Название: Re: Не работают горячие клавиши при скрытии меню
Отправлено: deMax от Декабря 10, 2013, 13:54
Fregloin, так я и создал QShortcut. Просто чтобы в меню показывались комбинации клавиш, пришлось QAction комбинацию назначить. Но тогда при видимом меню получается 2 комбинации и ни одна не работает, приходится отключать QShortcut.


Название: Re: Не работают горячие клавиши при скрытии меню
Отправлено: Bepec от Декабря 10, 2013, 16:53
Qmenu можно назначить уже существующий шорткар.


Название: Re: Не работают горячие клавиши при скрытии меню
Отправлено: Fregloin от Декабря 13, 2013, 09:58
поподробнее пожалуйста, я искал но не нашёл.


Название: Re: Не работают горячие клавиши при скрытии меню
Отправлено: deMax от Декабря 17, 2013, 07:17
Цитировать
поподробнее пожалуйста, я искал но не нашёл.
присоединяюсь к просьбе.


Название: Re: Не работают горячие клавиши при скрытии меню
Отправлено: Bepec от Декабря 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. При скрытии виджета, она убивает реакцию. мм... Ещё посмотрю.


Название: Re: Не работают горячие клавиши при скрытии меню
Отправлено: Bepec от Декабря 17, 2013, 12:59
В принципе как я и говорил, это заслуга системы шорткаров Qt. (верно для версии 4.7.2)

В самом шорткаре содержится следующая структура:
(http://img.pixs.ru/storage/3/5/7/1png_9291472_10123357.png) (http://pixs.ru/showimage/1png_9291472_10123357.png)

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

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


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

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


Код:
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, но я думаю что таие строки там есть.