Ответьте на "горячую клавишу" в приложении в Qt

У меня есть простое приложение Qt, и я просто хочу ответить на клавишу F12, независимо от того, какой виджет имеет фокус.

Есть ли какой-нибудь легкий сигнал или что-то, к чему я могу подключиться?

Я хочу использовать клавишу F12 для включения / выключения полноэкранного режима главного окна.

4 ответа

Решение

Я не пробовал, но вот что я хотел бы сделать:

Создайте QShortcut и убедитесь, что его контекстsetContext()) является Qt::ApplicationShortcut,

shortcut = new QShortcut(QKeySequence(Qt::Key_F12), parent);
shortcut->setContext(Qt::ApplicationShortcut);

Тогда вам просто нужно подключить слот к сигналу QShortcut::activ ().

Установка контекста ярлыка на Qt::ApplicationShortcutимеет серьезный недостаток. Это не будет работать в модальных диалогах. Поэтому, если вам нужен действительно реальный ярлык для всего приложения, вам нужно переопределить notify()метод. Альтернативой является установка фильтра событий для объекта приложения, но я подозреваю, что это будет медленнее и потребует немного больше кода. С участием notify() это очень просто:

class MyApplication : public QApplication
{
    // TODO: constructor etc.

protected:

bool MyApplication::notify(QObject *receiver, QEvent *event) override
{
    if (event->type() == QEvent::KeyPress)
    {
        auto keyEvent = static_cast<QKeyEvent*>(event);
        if (keyEvent->key() == Qt::Key_F12 && keyEvent->modifiers() == Qt::NoModifiers)
        {
            // TODO: do what you need to do
            return true;
        }  
    }
    return QApplication::notify(receiver, event);
}

}

Если у вас есть "центральный виджет", все остальные виджеты которого являются дочерними, то вы можете просто установить его как аргумент виджета для QShortcut.

(Python, qt5)

self.centralwidget = QtWidgets.QWidget(MainWindow)

QtWidgets.QShortcut(QtGui.QKeySequence("F12"), self.centralwidget, self.goFullScreen)

Я добавил это как ответ, потому что контекстный флаг ярлыка: Qt.ApplicationShortcut не работал для меня.

На основе ответа HiFile.app , но протестировано для PySide6 на Python 3.11 (и должно быть применимо для PySide2, но не проверено). Вам нужно будет создать подклассQApplicationи переопределитьnotifyфункция.

      class Application(QApplication):
    def notify(self, receiver: QObject, event: QEvent) -> bool:
        if event.type() == QEvent.Type.KeyPress:
            key_event = QKeyEvent(event)
            # Check if key event matches the desire shortcut key
            if key_event.key() == Qt.Key.Key_F12:
                # Do what you want here like toggling fullscreen mode
                return True  # Important! Need to return True for this to work

        return super().notify(receiver, event)
Другие вопросы по тегам