硬编码的快捷方式

hard-coded shortcuts

本文关键字:快捷方式 编码      更新时间:2023-10-16

我已经在几个地方问过这个问题,但我仍然无法弄清楚。

我想做的是在MainWindow中有一个QKeySequence(Qt::CTRL + Qt::Key_X, Qt::CTRL + Qt::Key_C)QTextEdit作为中心小部件。

问题是我有一个用于剪切(Ctrl + X)的shorcut,当我按Ctrl + X,Ctrl+ C时它不起作用。当焦点在不同的小部件上时,shorcut 可以完美地工作。

我尝试覆盖QWidget::keyPressEventQWidget::event,但它是一样的。

我还有一个问题:如果我有这两个 shorcut Ctrl+X 和 Ctrl+X Ctrl+C 为什么我在按 Ctrl+X 时没有收到信号activatedAmbigiously()根据Qt文档:

在键盘上键入键序列时,称为 只要它与多个快捷方式的开头匹配,就不明确。

这可能有点捏造,但您不能简单地在中央小部件上安装事件过滤器并查找您感兴趣的按键吗?

对我来说,下面的代码似乎按照您的描述进行操作,如果您按 CTRL+X它会启动一个计时器,该计时器在其 timeout() 上将触发QTextEdit上的cut()事件(这是QMainWindowcentralWidget())。相反,如果另一个关键事件带有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();
}

虽然这段代码对我有用,但其中可能有一些东西会干扰你正在做的其他事情。另外,我不是在回答您关于QKeySequenceactivatedAmbigiously()的任何问题。

让我知道这是否有帮助。