簡體   English   中英

Qml QTouchDevice

[英]Qml QTouchDevice

我是Qt的新人。 我正在使用Windows桌面應用程序並使用Qt和qml。 在沒有QTouchDevices PC上,組件之間的分割器(允許你在窗口上調整組件的元素)與鼠標一起工作(截圖“Good distance”),但如果屏幕是觸摸屏我有下一個問題,請查看截圖“錯誤的距離” ”。

我的應用程序不應該支持任何觸摸設備。 那么如何禁用這個Qt功能呢? 我需要像沒有觸摸屏的設備上一樣的行為。

錯誤的距離

錯誤的距離

好距離

好距離

我嘗試使用下一個樣本使用privet方法禁用觸摸設備:

QWindowSystemInterface::unregisterTouchDevice(QTouchDevice::devices().first());

這有效,但QWindowSystemInterface是私有類,它禁用觸摸屏。 QTCreator分離器中的QTCreator工作正常,完全符合我的需要。

如果你無法修補Qt,我能想到的唯一方法就是遍歷孩子,搜索MouseArea 例如,假設你有這個QML:

import QtQuick 2.5
import QtQuick.Controls 1.4
import QtQuick.Layouts 1.1

ApplicationWindow {
    width: 600
    height: 400
    visible: true

    property alias splitView: splitView

    SplitView {
        id: splitView
        anchors.fill: parent

        Rectangle {
            width: 200
            Layout.maximumWidth: 400
            color: "lightblue"
            Text {
                text: "View 1"
                anchors.centerIn: parent
            }
        }

        Rectangle {
            id: centerItem
            Layout.minimumWidth: 50
            Layout.fillWidth: true
            color: "lightgray"
            Text {
                text: "View 2"
                anchors.centerIn: parent
            }
        }
    }
}

然后,您可以打印出SplitView的對象樹,如下所示:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickItem>
#include <QDebug>

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

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

    QObject *window = engine.rootObjects().first();
    QQuickItem *splitView = window->property("splitView").value<QQuickItem*>();
    splitView->dumpObjectTree();

    return app.exec();
}

這給你:

SplitView_QMLTYPE_1:: 
    QQmlComponent:: 
    QQuickSystemPalette:: 
    QObject_QML_2:: 
    QQmlComponent:: 
    QQuickItem:: 
    QQuickItem:: 
    QQuickItem:: 
        QQuickLoader_QML_3:: 
            QObject_QML_4:: 
            QQuickMouseArea_QML_5:: 
            QQuickRectangle:: 
                QQmlContext:: 
    QQuickItem:: 
    QQmlComponentAttached:: 
    QQuickRectangle:: 
        QQuickText:: 
        QQuickLayoutAttached:: 
    QQuickRectangle:: 
        QQuickText:: 
        QQuickLayoutAttached:: 
    QQuickLayoutAttached:: 

QObject::dumpObjectTree() 打印出metaObject->className() ,因此我們知道要查找metaObject具有匹配的className的對象:

然后:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickItem>
#include <QScreen>
#include <QWindow>
#include <QDebug>

QQuickItem *findMouseArea(QQuickItem *item)
{
    foreach (QQuickItem *childItem, item->childItems()) {
        if (QString(childItem->metaObject()->className()).startsWith(QStringLiteral("QQuickMouseArea_QML"))) {
            return childItem;
        } else {
            QQuickItem *mouseArea = findMouseArea(childItem);
            if (mouseArea) {
                return mouseArea;
            }
        }
    }

    return 0;
}

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

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

    QWindow *window = qobject_cast<QWindow*>(engine.rootObjects().first());
    QQuickItem *splitView = window->property("splitView").value<QQuickItem*>();
    QQuickItem *mouseArea = findMouseArea(splitView);
    mouseArea->setProperty("defaultMargin", QVariant(window->screen()->physicalDotsPerInch() / 25.4));

    return app.exec();
}

顯然, Screen::pixelDensity 使用屏幕每英寸的物理點數除以25.4 ,所以我們也復制了它。 你可以在那里使用任何其他值。

例如,如果要引入第二個MouseArea則需要調整代碼。

它仍然在很大程度上依賴於私有API,但它至少不會觸及Qt代碼。

快速簡便:啟用/禁用鼠標和觸摸合成

無需修補或執行任何瘋狂的樹查找, 只需啟用或禁用鼠標或觸摸合成

  • Qt的:: AA_SynthesizeTouchForUnhandledMouseEvents
  • Qt的:: AA_SynthesizeMouseForUnhandledTouchEvents

只需禁用您不想要的內容 ,鼠標或觸摸即可僅接受真實事件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM