0

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

4

1 回答 1

1

Qt 文档状态: -

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

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

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

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

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

3)选择第二项

4) 翻译视图

5)等。

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

于 2013-07-04T08:19:04.623 回答