【问题标题】:How to get multitouch to work in QGraphicsView, Qt 5.0.2 in Windows 8如何让多点触控在 Windows 8 中的 QGraphicsView、Qt 5.0.2 中工作
【发布时间】:2021-01-08 19:19:05
【问题描述】:

我正在努力让多点触控来处理我添加到 QGraphicsView 的几个 QWidget。我创建了 QWidget 的子类,在其中设置了 QGraphicsScene 和 QGraphicsView。这是我的(测试)QWidget 子类:

#include "qttest1.h"

#include <QtWidgets>
#include <QTouchEvent>

qttest1::qttest1(QWidget *parent)
    : QWidget(parent)
{
    setEnabled(true);

    if(!QCoreApplication::testAttribute(Qt::AA_DontCreateNativeWidgetSiblings))
        setAttribute(Qt::WA_NativeWindow);

    setAttribute(Qt::WA_AcceptTouchEvents);

    scene = new QGraphicsScene(this);
    scene->setSceneRect(0, 0, 1920, 1080);
    graphicsView = new QGraphicsView(scene, this);
    graphicsView->setRenderHints(QPainter::Antialiasing);
    graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    graphicsView->setAttribute(Qt::WA_AcceptTouchEvents);
    graphicsView->viewport()->setAttribute(Qt::WA_AcceptTouchEvents);

    QBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(graphicsView);

    setLayout(layout);
}

qttest1::~qttest1() {}

void qttest1::showGraphics() 
{
    for(int i = 0; i < 10; i++)
    {
        Dial *dial = new QDial();

        dial->move(i * 120 + 50, 200);
        dial->resize(120, 120);
        dial->setAttribute(Qt::WA_AcceptTouchEvents);

        QGraphicsProxyWidget *proxy = scene->addWidget(dial);
        proxy->setAcceptTouchEvents(true);
    }
}

这是我的主要内容:

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    app.setAttribute(Qt::AA_DontCreateNativeWidgetSiblings);

    QRect rect = app.desktop()->screenGeometry();

    qttest1 test;
    test.resize(rect.width(), rect.height());
    test.showFullScreen();
    test.showGraphics();

    return app.exec(); 
}

我知道代码不是很漂亮,可能有点泄漏,但重点是尝试让多点触控工作。

我可以看到并使用我添加到场景中的每一种小部件,但只要我触摸表盘,它就会吞噬第一次触摸之后的每一次触摸。这使得表盘在几个位置之间跳转。我想要的是每个表盘(或任何类型的小部件)都可以同时单独使用。我正在使用 QT 5.0.2、Windows 8 和一个最多支持 10 点触控的显示器。

【问题讨论】:

    标签: windows qt multi-touch qgraphicsview


    【解决方案1】:

    Qt 文档状态:-

    重新实现 QWidget::event() 或 QAbstractScrollArea::viewportEvent() 用于小部件和 QGraphicsItem::sceneEvent() 用于图形中的项目 查看以接收触摸事件。

    因此,我认为您需要处理 QEvent::TouchBegin、QEvent::TouchUpdate 和 QEvent::TouchEnd 事件,我在您发布的代码中没有看到这些事件。

    Qt 可能会为您处理第一次触摸,但它不会知道您想对第二次、第三次、第四次等同时触摸做什么。例如,您可能希望您的应用在第二次触摸移动时执行以下任何操作:-

    1) 旋转第一项结束的对象

    2) 缩放第一项超过的对象

    3) 选择第二项

    4) 翻译视图

    5) 等等

    因此,您需要处理连续的触摸以执行您希望它执行的操作。此外,您可能想查看 Qt 中的手势。

    【讨论】:

    • 我在其中一个示例中以及在我编写的一个小示例中看到了多点触控在 QGraphicsView 中的工作。但这不是问题,问题是小部件不能同时工作。例如。如果我将两个 QSlide 添加到 QGraphicsScene 并尝试同时使用它们(使用触摸),那么只有我第一次触摸的那个会起作用。即使我不使用 QGraphicsScene(和 QGraphicsView)进行测试,似乎也存在问题,但我没有对其进行足够的测试以得出任何真正的结论。你是说我必须实现我自己的小部件/graphisitems 才能让它按我的意愿工作?
    • QSlide 不是 QGraphicsItem 或 Object,您是通过 QGraphicsProxyWidget 使用它吗?如果是这样,有很多东西不会传递到实际的小部件,这可能就是其中之一。至于您的问题,是的,我希望您需要从 GraphicsItem 继承来定义其响应多点触控的特定行为;至少我在 Qt 4.8 中使用它时就是这样做的
    • 是的,我通过 QGraphicsProxyWidget 使用它。我可以接受触摸之类的东西不会传递给 QGraphicsScene 中的小部件,但我觉得奇怪的是它们会传递,例如如果我将 QSlide 添加到 QGraphicsScene 它可以按预期使用触摸,但同时使用两个 QSlide 将无法正常工作。
    • 我记得在多点触控无法正常工作的代理项目上遇到过类似的问题。我们当时联系了Qt,但一直没有得到满意的答复。那是大约一年半前的事了,所以 Qt 5 中的情况可能发生了变化。我确实做到了,但是按照我的回答中所述实现了触摸处理,发现它适用于常规 QGraphicsItems,但不适用于代理小部件。
    猜你喜欢
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    相关资源
    最近更新 更多