[英]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代碼。
無需修補或執行任何瘋狂的樹查找, 只需啟用或禁用鼠標或觸摸合成 。
只需禁用您不想要的內容 ,鼠標或觸摸即可僅接受真實事件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.