1

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

我想要做的是有一个in QKeySequence(Qt::CTRL + Qt::Key_X, Qt::CTRL + Qt::Key_C)a作为中心小部件。MainWindowQTextEdit

问题是我有一个 Cut ( Ctrl+X) 的快捷方式,当我按下 时Ctrl+XCtrl+C它不起作用。当焦点在不同的小部件上时,快捷方式可以完美运行。

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

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

当在键盘上键入一个键序列时,只要它与多个快捷方式的开头匹配,就可以说它是模棱两可的。

4

1 回答 1

1

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

对我来说,下面的代码似乎符合您的描述,如果您按下CTRL+X它会启动一个计时器,该计时器会在其 timeout() 上触发一个cut()事件QTextEdit(这是centralWidget()QMainWindow)。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

主窗口.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();
}

虽然此代码对我有用,但其中可能会干扰您正在做的其他事情。另外,我没有解决您关于QKeySequenceand的任何问题activatedAmbigiously()

让我知道这是否有帮助。

于 2015-09-17T15:22:50.933 回答