繁体   English   中英

如何让多点触控在 Windows 8 中的 QGraphicsView、Qt 5.0.2 中工作

[英]How to get multitouch to work in QGraphicsView, Qt 5.0.2 in Windows 8

我正在努力让多点触控来处理我添加到 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 次触摸的显示器。

Qt 文档状态:-

为小部件重新实现 QWidget::event() 或 QAbstractScrollArea::viewportEvent(),为图形视图中的项目重新实现QGraphicsItem::sceneEvent()以接收触摸事件。

有了这个,我相信您需要处理 QEvent::TouchBegin、QEvent::TouchUpdate 和 QEvent::TouchEnd 事件,我在您发布的代码中没有看到这些事件。

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

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

2)缩放第一项结束的对象

3)选择第二项

4) 翻译视图

5)等。

所以,你需要处理连续的触摸来做你想要它做的事情。 另外,您可能想查看 Qt 中的手势。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM