如何在事件过滤器中相互更改Left_Key和Right_Key事件

How can change Left_Key and Right_Key events to each other in eventFilter?

本文关键字:Key Left 事件 Right 事件过滤器      更新时间:2023-10-16

我有一个可编辑的QWebView。在eventFilter中,我想将 Qt::Left_Key 事件更改为 Qt::Right_Key,反之亦然,以便在 webview 中获取文本光标位置。这是我的代码:

bool MyClass::eventFilter(QObject *o, QEvent *e)
{
    if(o == p->webView) {
        switch(static_cast<int>(e->type()))
        {
        ...
        case QEvent::KeyPress:
            if(static_cast<QKeyEvent*>(e)->key() == Qt::Key_Left) {
                QKeyEvent* event = new QKeyEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier);
                QApplication::postEvent(p->webView, event);
                return true;
            }
            else
            if(static_cast<QKeyEvent*>(e)->key() == Qt::Key_Right) {
                QKeyEvent* event = new QKeyEvent(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier);
                QApplication::postEvent(p->webView, event);
                return true;
            }
        break;
        }
    }
    return QWidget::eventFilter(o,e);
}

但是当我创建一个 QKeyEvent 并将其发布到应用程序时,我猜 eventFilter 再次调用我发布到应用程序的 QKeyEvent 和向左移动的 webview textCursor(例如),再次向右移动,似乎它的位置没有改变。

如何解决这个问题?谁能帮忙?

我检查了我对QEvent中可用的自发属性的直觉。

下面是一个示例,显示了它如何用于在QTextEdit中反转键导航(左、右)。转置到 Web 视图应该是微不足道的。

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //install the filter for your "source" of key event
    ui->sourceEdit->installEventFilter(this);
}
MainWindow::~MainWindow()
{
    delete ui;
}
bool MainWindow::eventFilter(QObject *src, QEvent *ev)
{
    if (src == ui->sourceEdit) {
        if (ev->type() == QEvent::KeyPress) {
            if (ev->spontaneous()) {
                qDebug() << "I am spontaneous";
                QKeyEvent* keyEv = static_cast<QKeyEvent*>(ev);
                if (keyEv->key() == Qt::Key_Left) {
                    QKeyEvent* event = new QKeyEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier);
                    QApplication::postEvent(ui->sourceEdit, event);
                    return true;
                } else if (keyEv->key() == Qt::Key_Right) {
                    QKeyEvent* event = new QKeyEvent(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier);
                    QApplication::postEvent(ui->sourceEdit, event);
                    return true;
                }
            } else {
                //here pass all event that are not coming from the underlying System.
                qDebug() << "not spontaneous";
            }
        }
    }
    return QMainWindow::eventFilter(src, ev);
}
相关文章: