gpt4 book ai didi

qt - Qml QTouchDevice

转载 作者:行者123 更新时间:2023-12-01 14:59:48 27 4
gpt4 key购买 nike

我是 Qt 的新手。我正在开发 Windows 桌面应用程序并将 Qt 与 qml 一起使用。在没有 QTouchDevices 的 PC 上,组件之间的分隔符(允许您在窗口上调整组件大小的元素)与鼠标配合使用效果很好(屏幕截图“Good distance”),但如果屏幕是触摸屏,我会遇到下一个问题,请查看屏幕截图“错误的距离”。

我的应用程序不应该支持任何触摸设备。那么如何禁用这个Qt特性呢?我需要像在没有触摸屏的设备上一样的行为。

错误的距离

Wrong distance

良好的距离

Good distance

我尝试使用下一个示例使用 privet 方法禁用触摸设备:

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

这有效,但是 QWindowSystemInterface 是私有(private)类,它禁用触摸屏。 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() prints out 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 is calculated使用屏幕每英寸的物理点数除以 25.4,因此我们也复制它。您可以在那里使用任何其他值。

例如,如果引入第二个 MouseArea,您将需要调整代码。

它仍然在很大程度上依赖于私有(private) API,但至少不涉及 Qt 代码。

关于qt - Qml QTouchDevice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34989926/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com