首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过发送TableView在QKeyEvent项之间移动?

如何通过发送TableView在QKeyEvent项之间移动?
EN

Stack Overflow用户
提问于 2016-01-09 09:40:31
回答 1查看 349关注 0票数 0

我在我的QML文件中有一个TableView,通过向它提供模型,其中加载了几个条目。我可以通过箭头键在项目之间导航(向上,向下),但我不知道如何通过代码在项之间导航。

下面是我试图发送事件的方式,但似乎我将事件发送到了一个错误的组件:

代码语言:javascript
复制
QQuickItem* focusedItem = qobject_cast<QQuickItem*>(QGuiApplication::focusObject());

QKeyEvent *event1 = new QKeyEvent(QEvent::KeyPress,Qt::Key_Up,Qt::NoModifier);
QKeyEvent *event2 = new QKeyEvent(QEvent::KeyRelease,Qt::Key_Up,Qt::NoModifier);
QCoreApplication::postEvent (focusedItem, event1);
QCoreApplication::postEvent (focusedItem, event2);

焦点项似乎是一个focusScope,它的父项是空QObject!我用这个来测试这个:

代码语言:javascript
复制
qDebug () << "ITEM =>" << focusedItem;
qDebug () << "PARENT=>" << focusedItem->parent();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-09 10:38:55

一个寻找类似的东西的好地方是Qt本身的自动测试。例如,如果您查看tst_tableview.qml,您将看到键事件没有发送到特定项。相反,预先给目标项以焦点,并将事件发送到窗口:

代码语言:javascript
复制
table.forceActiveFocus();
keyClick(Qt.Key_Down);

因此,作为一个小例子:

代码语言:javascript
复制
#include <QtGui>
#include <QtQuick>

class Controller : public QObject
{
    Q_OBJECT

public:
    Controller() :
        mTarget(0),
        mTimerId(0) {
    }

    void setTarget(QQuickItem *item) {
        if (item == mTarget)
            return;

        mTarget = item;

        if (mTarget)
            mTimerId = startTimer(1000);
        else
            killTimer(mTimerId);
    }

    void timerEvent(QTimerEvent *) {
        if (mTarget) {
            QKeyEvent *event1 = new QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier);
            QKeyEvent *event2 = new QKeyEvent(QEvent::KeyRelease, Qt::Key_Down, Qt::NoModifier);
            QCoreApplication::postEvent(mTarget->window(), event1);
            QCoreApplication::postEvent(mTarget->window(), event2);
        }
    }

private:
    QQuickItem *mTarget;
    int mTimerId;
};

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    Controller controller;

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

    controller.setTarget(engine.rootObjects().first()->property("target").value<QQuickItem*>());

    return app.exec();
}

#include "main.moc"

当在控制器上设置目标项时,我们启动一个定时器,它每秒钟向项目所在的窗口发送一个下行事件。如果您只有一个窗口,那么就没有必要有一个目标的概念;在发送事件之前,只需将焦点放在QML中的正确项上即可。

然后,在main.qml

代码语言:javascript
复制
import QtQuick 2.5
import QtQuick.Controls 1.3
import QtQuick.Layouts 1.1

ApplicationWindow {
    id:  winRoot
    visible: true
    width: 500
    height: 500

    property alias target: tableView

    TableView {
        id: tableView
        focus: true
        model: ListModel {
            id: libraryModel
            ListElement {
                title: "A Masterpiece"
                author: "Gabriel"
            }
            ListElement {
                title: "Brilliance"
                author: "Jens"
            }
            ListElement {
                title: "Outstanding"
                author: "Frederik"
            }
        }

        TableViewColumn {
            role: "title"
            title: "Title"
            width: 100
        }
        TableViewColumn {
            role: "author"
            title: "Author"
            width: 200
        }
    }
}

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34691904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档