Pregunta

Estoy agregando un montón de QActions a los menús de mi ventana principal. Estas acciones también pueden ser provocados por el teclado, y quiero que el acceso directo a ser visible en el menú, como es habitual, por ejemplo,

-----------------
|Copy     Ctrl+C|
-----------------

Puedo hacer esto utilizando QAction.setShortcut(). Sin embargo, me No quieren estos QActions a ser provocados por los atajos; Estoy manejo de toda la entrada de teclado separado en otro lugar.

¿Es esto posible? ¿Puedo desactivar el acceso directo en el QAction pero todavía tiene el texto de acceso directo (en este ejemplo Ctrl + C ) en los menús de mi?

Editar : La forma en que terminé haciendo que se conecta a eventos aboutToShow() y aboutToHide() del menú, y la activación / desactivación de los accesos directos por lo que sólo están activos cuando se muestra el menú. Pero te agradecería una solución más limpia ...

¿Fue útil?

Solución

Se puede heredar de QAction y anular QAction :: evento (QEvent *):

class TriggerlessShortcutAction : public QAction
{
public:
    ...ctors...

protected:
    virtual bool event(QEvent* e)
    {
        if (e->type() == QEvent::Shortcut)
            return true;
        else
            return QAction::event(e);
    }
};

Esto hará que cualquier evento de tipo QEvent :: acceso directo enviado a sus acciones para no desencadenar las señales disparadas '()'.

Otros consejos

action.setText("Copy\tCtrl+C");

Esto se verá como una acción con un acceso directo, pero el acceso directo no está instalada.

Este es un ejemplo completo:

#include <QtGui>

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    QMainWindow win;

    QMenu *menu = win.menuBar()->addMenu("Test");

    // This action will show Ctrl+T but will not trigger when Ctrl+T is typed.
    QAction *testAction = new QAction("Test\tCtrl+T", &win);
    app.connect(testAction, SIGNAL(triggered(bool)), SLOT(quit()));
    menu->addAction(testAction);

    // This action will show Ctrl+K and will trigger when Ctrl+K is typed.
    QAction *quitAction = new QAction("Quit", &win);
    quitAction->setShortcut(Qt::ControlModifier + Qt::Key_K);
    app.connect(quitAction, SIGNAL(triggered(bool)), SLOT(quit()));
    menu->addAction(quitAction);

    win.show();

    return app.exec();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top