硬编码的快捷方式
hard-coded shortcuts
我已经在几个地方问过这个问题,但我仍然无法弄清楚。
我想做的是在MainWindow
中有一个QKeySequence(Qt::CTRL + Qt::Key_X, Qt::CTRL + Qt::Key_C)
,QTextEdit
作为中心小部件。
问题是我有一个用于剪切(Ctrl + X)的shorcut,当我按Ctrl + X,Ctrl+ C时它不起作用。当焦点在不同的小部件上时,shorcut 可以完美地工作。
我尝试覆盖QWidget::keyPressEvent
和QWidget::event
,但它是一样的。
我还有一个问题:如果我有这两个 shorcut Ctrl+X 和 Ctrl+X Ctrl+C 为什么我在按 Ctrl+X 时没有收到信号activatedAmbigiously()
?根据Qt文档:
在键盘上键入键序列时,称为 只要它与多个快捷方式的开头匹配,就不明确。
这可能有点捏造,但您不能简单地在中央小部件上安装事件过滤器并查找您感兴趣的按键吗?
对我来说,下面的代码似乎按照您的描述进行操作,如果您按 CTRL+X
它会启动一个计时器,该计时器在其 timeout() 上将触发QTextEdit
上的cut()
事件(这是QMainWindow
的centralWidget()
)。相反,如果另一个关键事件带有CTRL+C
,而CTRL+X
标志仍处于活动状态,它将触发close()
。
主窗口.h
#ifndef MYMAINWINDOW_H
#define MYMAINWINDOW_H
#include <QMainWindow>
#include "ui_mainwindow.h"
#include <QTimer>
class MainWindow: public QMainWindow, private Ui::MainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0 );
virtual bool eventFilter(QObject *obj, QEvent *event);
public slots:
void passOnEvent();
private:
QTimer *timer;
bool xactive;
};
#endif
mainwindow.cc
#include "mainwindow.h"
#include <QMouseEvent>
#include <QKeyEvent>
MainWindow::MainWindow(QWidget *parent ) : QMainWindow(parent), timer (new QTimer), xactive(false)
{
setupUi(this);
centralWidget()->installEventFilter(this);
}
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if( obj != centralWidget() ) {
return QObject::eventFilter(obj, event);
} else if (event->type() == QEvent::KeyPress ) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if( keyEvent->key() == Qt::Key_X && keyEvent->modifiers() == Qt::ControlModifier ) {
timer->start(250);
connect(timer,SIGNAL(timeout()),this,SLOT(passOnEvent()));
xactive = true;
return true;
} else if( xactive && keyEvent->key() == Qt::Key_C && keyEvent->modifiers() == Qt::ControlModifier ) {
this->close();
return true;
} else {
return QObject::eventFilter(obj, event);
}
} else {
// standard event processing
return QObject::eventFilter(obj, event);
}
}
void MainWindow::passOnEvent()
{
xactive = false;
timer->stop();
static_cast<QTextEdit*>(centralWidget())->cut();
}
虽然这段代码对我有用,但其中可能有一些东西会干扰你正在做的其他事情。另外,我不是在回答您关于QKeySequence
和activatedAmbigiously()
的任何问题。
让我知道这是否有帮助。
- 如何在c++中为模板函数实例创建快捷方式
- C++ ->运算符 [] 的快捷方式
- C++结构模板变量快捷方式定义不起作用
- 用于基于成员字段或函数创建比较器的快捷方式
- c++ Visual Studio 2015 快捷方式,用于从选择代码中生成功能
- 是否有用于"go to variable type definition" C++中"auto"变量的 Visual Studio 键盘快捷方式?
- Qt全局快捷方式扩展劫持快捷方式
- 在Qt Creator中应用代码更改的快捷方式是什么?
- 是否有快捷方式重叠运算符?
- 使用 C++ 显示 (.lnk) 快捷方式文件的真实路径
- 一个按钮有两个或多个快捷方式
- 通过TranslateAccelerator检测快捷方式时,忽略Shift键的状态
- 无论如何,是否可以确定MFC应用程序是通过PC重新启动或用户单击应用程序快捷方式开始的
- QDIR入口列表可以使用文件夹快捷方式透明地工作
- 快捷方式在C 中编写自定义编译命令时
- 自动热键:重新映射 MS Visio 的快捷方式,以将手动选择的对象对齐到顶部(好像按:"AlignTop")
- 如何为 QT Windows 应用程序设置不同的桌面快捷方式图标和任务栏图标不同
- 为什么 cppreference 将type_traits xxx_v快捷方式定义为内联 constexpr,而不仅仅是
- 具有OFN_ALLOWMULTISELECT不正确的快捷方式结果的 CFileDialog
- 硬编码的快捷方式