Qt 如何将QKeyEvent发送到特定的qml项目?

Qt 如何将QKeyEvent发送到特定的qml项目?,qt,qml,qkeyevent,Qt,Qml,Qkeyevent,我正在尝试将自定义的QKeyEvent(如按键B)发送到我的QML文件中的项目(如文本字段)。这是我写的,但它不起作用。该项(TextField)似乎没有获取我的事件(我假设这是因为没有B字符附加到我的TextField文本中)。我在我的ClickHandler类中捕获点击信号,然后在我的handleClick槽中,我尝试将一个自定义事件发布到我的焦点项目,这是一个文本字段 ClickHandler.h class ClickHandler : public QObject { Q_OB

我正在尝试将自定义的
QKeyEvent
(如按键B)发送到我的QML文件中的项目(如
文本字段
)。这是我写的,但它不起作用。该项(
TextField
)似乎没有获取我的事件(我假设这是因为没有
B
字符附加到我的
TextField
文本中)。我在我的
ClickHandler
类中捕获
点击
信号,然后在我的
handleClick
槽中,我尝试将一个自定义
事件
发布到我的
焦点项目
,这是一个
文本字段

ClickHandler.h

class ClickHandler : public QObject
{
    Q_OBJECT
    QQmlApplicationEngine* engine;
    QApplication* app;
public:
    explicit ClickHandler(QQmlApplicationEngine *,QApplication* app);

signals:

public slots:
    void handleClick();
};
ClickHandler.cpp:

#include "clickhandler.h"
#include <QMessageBox>
#include <QQuickItem>

ClickHandler::ClickHandler(QQmlApplicationEngine* engine, QApplication* app)
{
    this->engine = engine;
    this->app = app;

}

void ClickHandler::handleClick()
{
    QObject* root = engine->rootObjects()[0];
    QQuickItem *item = (root->property("activeFocusItem")).value<QQuickItem *>();
    if (item == NULL)
        qDebug() << "NO item";
    QKeyEvent* event = new QKeyEvent(QKeyEvent::KeyPress,Qt::Key_B,Qt::NoModifier);
    QCoreApplication::postEvent(item,event);
}
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    QObject* root = engine.rootObjects()[0];
    ClickHandler* ch = new ClickHandler(&engine, &app);
    QQuickItem* button = root->findChild<QQuickItem*>("button");

    QObject::connect(button, SIGNAL(clicked()), ch, SLOT(handleClick()));

    return app.exec();
}
ApplicationWindow {
    objectName: "rootWindow"
    visible: true
    Column {
        TextField {
            id: textId1
            objectName: "text1"
            text: "text1 message"
            focus: true
        }

        TextField {
            id: textId2
            objectName: "text2"
            text: "text2 message"
        }
        Button {
            objectName: "button"
            text : "Click me";
        }
    }
}

如果您实现了
onPressed
处理程序,您可以看到问题所在

ApplicationWindow {
    objectName: "rootWindow"
    visible: true
    Column {
        TextField {
            id: textId1
            objectName: "text1"
            text: "text1 message"
            focus: true

            Keys.onPressed: {
                console.log("textId1: " + event.key + " : " + event.text)
            }
        }

        TextField {
            id: textId2
            objectName: "text2"
            text: "text2 message"

            Keys.onPressed: {
                if (event.key === Qt.Key_B) {
                    console.log("I like B's but not QString's")
                }
            }
        }

...
此代码打印
qml:textId1:66:
,因为该键的文本为空

您需要使用以下内容创建事件:

Qt::Key key = Qt::Key_B;
QKeyEvent* event = new QKeyEvent(QKeyEvent::KeyPress,
                                 key,
                                 Qt::NoModifier,
                                 QKeySequence(key).toString());

嗨@Shnd!你解决了你最后的问题吗?你看到我的答案了吗?我看到您正在使用这里的
activeFocusItem
,所以我想您的一些老问题已经解决了。如果是,请将这些问题标记为已解决或再次寻求帮助。是@Tarod。实际上,多亏了你和其他人,我解决了很多问题。我正试图找一些空闲时间为这些问题写下我自己的答案。但是,把这一切放在一边,谢谢你花了这么多时间回答我的问题,并给了我很好的回答。:)谢谢,这正是问题所在。你能告诉我为什么仅仅使用Qt::Key_B是不够的吗?这是否意味着您希望发送按键事件B(无论按键B对项目意味着什么)?你能给我一个实际的例子吗?你想把B键映射到其他文本吗?!我刚刚更新了答案。实际上,在
QKeyEvent
中设置文本并不总是必要的。您只需使用
即可执行不同的任务。例如,获取左光标键
Qt.key\u left
并移动
。关于你的最后一个问题,恐怕我没有一个好的例子给你:(我想这真的取决于你想要实现什么。