Qt 对textedit 的快捷键(eg:ctrl+c等)的屏蔽

起因:有人问了这么一个问题。

qtextedit 输入文字,选中按ctrl+c,不能复制在textedit 中,但是可以复制在 记事本中

  1. 我的第一个解决方案是 :继承一个new的类,重写Qtextedit的按键重写事件;eg:
void QNText::keyPressEvent(QKeyEvent *e)
{
    if (e->modifiers()==  Qt::ControlModifier && e->key()== Qt::Key_V)
    {
        qDebug()<<"11111";
        return;
    }
    else
        return keyPressEvent(e);
}

// 结果程序崩溃,这个原因现在 未找到,可以试试

一开始觉得很简单,虽然事后诸葛亮还是简单。
我第一个方法行不通之后,就开始疯狂百度,有一个很关键的词语亮了出来:eventFilter 事件过滤器。

我打开textedit 查看他的虚函数如下:自行查看

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
  {
      if (obj == textEdit) {
          if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
 qDebug() << "Ate key press" << keyEvent->key();
              return true;
          } else {
              return false;
          }
      } else {
          // pass the event on to the parent class
          return QMainWindow::eventFilter(obj, event);
      }
  }

这不就是原型嘛照着改不就好了吗,我陷入了第二个问题, 无法进入eventFilter ,一度想要放弃,偶然的复制粘贴,代码能走了。

错误原因是:eventfilter大写的,我用的是小写

接下来就是找组合键嘛,一搜两种方案:

if (keyEvent->matches(QKeySequence::Paste))
if (keyEvent->modifiers()== Qt::ControlModifier && keyEvent->key()==Qt::Key_V)

具体解释,请自行查阅qt手册。

最终结果

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    ui->textEdit->installEventFilter(this);
    //    ui->label->installEventFilter(this);
    //    ui->label->setMouseTracking(true);
}
 if (obj ==ui->textEdit)
    {
        if (ev->type() == QEvent::KeyPress)
        {
            QKeyEvent *keyEvent = static_cast<QKeyEvent*>(ev);
//            if (keyEvent->matches(QKeySequence::Paste))
//                    qDebug()<<"复制";
              if (keyEvent->modifiers()== Qt::ControlModifier && keyEvent->key()==Qt::Key_V)

              {qDebug()<<"是个真的";
                return true;
              }
              else
                  return false;
        }
       else
        {
            return false;
        }
    }
    else
        return Widget::eventFilter(obj, ev);

虽然他没感谢我,但我还是学到了对键盘事件的操作。

你可能感兴趣的:(QT)