Qt:如何将两步快捷键应用于操作
我知道如何将键盘快捷键应用于操作。在某些软件(如Visual Studio)中,有一些快捷方式可以在多个步骤中完成这项工作(如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
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键并释放其中一个来混淆它。谢谢,我尝试了你的方法,效果很好。我认为这无疑是最简单但最有用的方法。