Qt:如何将两步快捷键应用于操作

Qt:如何将两步快捷键应用于操作,qt,user-interface,Qt,User Interface,我知道如何将键盘快捷键应用于操作。在某些软件(如Visual Studio)中,有一些快捷方式可以在多个步骤中完成这项工作(如Ctrl+K,Ctrl+C对代码进行注释) 崇高文本中的另一个例子: 我想知道是否可以在Qt中实现。您可以使用它来获取鼠标和键盘事件 我使用布尔值获取第一个和第二个键,Ctrl+K然后是C 我给你做了一个示例代码,它正在运行 .cpp文件: #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::M

我知道如何将键盘快捷键应用于操作。在某些软件(如Visual Studio)中,有一些快捷方式可以在多个步骤中完成这项工作(如
Ctrl+K
Ctrl+C
对代码进行注释)

崇高文本中的另一个例子:

我想知道是否可以在Qt中实现。

您可以使用它来获取鼠标和键盘事件

我使用布尔值获取第一个和第二个键,Ctrl+K然后是C

我给你做了一个示例代码,它正在运行

.cpp文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    firstKey = false;
    secondKey = false;
    this->installEventFilter(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

bool MainWindow::eventFilter(QObject *object, QEvent *event)
{
    if (object == this &&event->type() == QEvent::KeyPress)
    {
        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
        if ((keyEvent->key() == Qt::Key_Control))
        {
            firstKey = true;
            return true;
        }
        else if ((keyEvent->key() == Qt::Key_K))
        {
            secondKey = true;
            return true;
        }
        else if ((keyEvent->key() == Qt::Key_C))
        {
            if(firstKey && secondKey)
            {
                firstKey = false;
                secondKey = false;
                QMessageBox::information(this, "", "Ctrl + k + c");
            }
            return true;
        }
        else
            return false;
    }
    else
        return false;
}

void MainWindow::keyReleaseEvent(QKeyEvent *e)
{
    if (e->type() == QEvent::KeyRelease)
    {
        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(e);
        if ((keyEvent->key() == Qt::Key_Control))
        {
            firstKey = false;
        }
    }
}
#包括“mainwindow.h”
#包括“ui_main window.h”
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
firstKey=false;
secondKey=false;
此->installEventFilter(此);
}
MainWindow::~MainWindow()
{
删除用户界面;
}
bool主窗口::事件过滤器(QObject*对象,QEvent*事件)
{
if(object==this&&event->type()==QEvent::KeyPress)
{
QKeyEvent*keyEvent=静态广播(事件);
如果((keyEvent->key()==Qt::key\u控件))
{
firstKey=true;
返回true;
}
如果((keyEvent->key()==Qt::key_K))
{
secondKey=true;
返回true;
}
如果((keyEvent->key()==Qt::key_C))
{
如果(第一个键和第二个键)
{
firstKey=false;
secondKey=false;
QMessageBox::信息(这个,“,”Ctrl+k+c”);
}
返回true;
}
其他的
返回false;
}
其他的
返回false;
}
void主窗口::keyReleaseEvent(QKeyEvent*e)
{
如果(e->type()==QEvent::KeyRelease)
{
QKeyEvent*keyEvent=static_cast(e);
如果((keyEvent->key()==Qt::key\u控件))
{
firstKey=false;
}
}
}
.h文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDebug>
#include <QMessageBox>
#include <QKeyEvent>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    bool firstKey;
    bool secondKey;
    bool eventFilter(QObject *object, QEvent *event);
    void keyReleaseEvent(QKeyEvent *e);

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
\ifndef主窗口
#定义主窗口
#包括
#包括
#包括
#包括
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
布尔第一键;
布尔第二键;
bool事件过滤器(QObject*对象,QEvent*事件);
无效密钥释放事件(QKeyEvent*e);
私人:
Ui::MainWindow*Ui;
};
#endif//main窗口

您可以使用的多参数构造函数创建它

像这样:

auto ac = new QAction(this);
ac->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_K, Qt::CTRL + Qt::Key_C));
试试这个:

action->setShortcut("Ctrl+K,Ctrl+C");
QKeySequence
可以从
QString
隐式创建。 由于:

最多可以输入四个按键代码,用逗号分隔,例如“Alt+X、Ctrl+S、Q”

当您通过Qt设计器为
QAction
创建快捷方式时,MOC生成几乎相同的代码。但这让情况略有不同:

action->setShortcut(QApplication::translate("MainWindow", "Ctrl+K, Ctrl+C", 0));

但实际上是一样的。

我认为您的实现存在缺陷。您必须区分单键按下和组合键按下。在当前的实现中,我可以通过分别按下和释放
Ctrl
然后
K
然后
C
键来触发消息框。或者,
K
Ctrl
,然后是
C
,这是不正确的。这个想法是同时按下
Ctrl
C
键来触发动作。我错了吗?@vahancho你是对的。我更新我的答案。现在需要按住Ctrl键来获取MsgBox.Hm,但是不需要编写太多代码来处理
Ctrl
键,也可以更轻松地实现同样的功能。如果使用
QKeyEvent::modifiers()
检查是否按下了
Ctrl
,该怎么办?类似于:
if(keyEvent->key()==Qt::key\K&&keyEvent->modifiers()==Qt::ControlModifier).
@vahancho是的,它可以用更少的代码实现。但是请阅读。--警告:不能始终信任此功能。用户可以通过同时按下两个Shift键并释放其中一个来混淆它。谢谢,我尝试了你的方法,效果很好。我认为这无疑是最简单但最有用的方法。