我在几个地方问了这个问题,但我还是想不出来。
我要做的是在QKeySequence(Qt::CTRL + Qt::Key_X, Qt::CTRL + Qt::Key_C)
中MainWindow
QTextEdit
作为中心窗口小部件。
问题是我有剪切切换( Ctrl + X ),当我按 Ctrl + X 时, Ctrl + C 它不起作用。当焦点在不同的小部件上时,shorcut工作得很好。
我尝试覆盖QWidget::keyPressEvent
和QWidget::event
,但它是一样的。
我还有一个问题:如果我有这两个shorcuts Ctrl + X 和 Ctrl + X Ctrl + C 为什么我要'按 Ctrl + X 时收到信号activatedAmbigiously()
?根据Qt文档:
当键盘上键入键序列时,据说是 只要它匹配多个快捷方式的开头就不明确。
答案 0 :(得分:1)
这可能有点像软糖,但你不能简单地在中央小部件上安装事件过滤器并寻找你感兴趣的按键吗?
以下代码似乎按照您的描述进行操作,如果您按column
它会启动一个计时器,该计时器在超时()时会触发CTRL+X
上的cut()
事件(这是QTextEdit
的{{1}}。如果centralWidget()
标记仍处于活动状态时,另一个关键事件带有QMainWindow
,则会触发CTRL+C
。
<强> mainwindow.h 强>
CTRL+X
<强> mainwindow.cc 强>
close()
虽然这段代码对我有用,但可能会有一些东西干扰你正在做的其他事情。另外,我没有解决您对#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
和#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();
}
提出的任何问题。
如果有帮助,请告诉我。