Как заставить мультитач работать в QGraphicsView, Qt 5.0.2 в Windows 8

Я изо всех сил пытаюсь заставить мультитач работать с парой QWidgets, которые я добавил в QGraphicsView. Я создал подкласс 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 касаний.


person Finitely Failed    schedule 03.07.2013    source источник


Ответы (1)


В документах Qt указано: -

Переопределите QWidget::event() или QAbstractScrollArea::viewportEvent() для виджетов и QGraphicsItem::sceneEvent() для элементов в графическом представлении, чтобы получать события касания.

При этом я считаю, что вам нужно обрабатывать события QEvent::TouchBegin, QEvent::TouchUpdate и QEvent::TouchEnd, которых я не вижу в опубликованном вами коде.

Qt может обработать первое касание за вас, но не будет знать, что вы хотите делать со вторым, третьим, четвертым и т. д. одновременными касаниями. Например, вы можете захотеть, чтобы ваше приложение выполняло одно из следующих действий при перемещении вторым касанием:

1) Поверните объект, чтобы первый элемент закончился

2) Масштабировать объект, чтобы первый элемент закончился

3) Выберите второй пункт

4) Перевести вид

5) и т. д.

Итак, вам нужно обрабатывать последовательные касания, чтобы делать то, что вы хотите. Кроме того, вы можете взглянуть на жесты в Qt.

person TheDarkKnight    schedule 04.07.2013
comment
Я видел работу мультитач внутри QGraphicsView в одном из примеров, а также в небольшом примере, который я написал. Однако проблема не в этом, проблема в том, что виджеты не работают одновременно. Например. если я добавлю два QSlide в QGraphicsScene и попытаюсь использовать их одновременно (используя касание), будет работать только тот, к которому я прикоснулся первым. Кажется, есть проблема, даже когда я тестирую это, не используя QGraphicsScene (и QGraphicsView), но я не тестировал его достаточно, чтобы сделать какие-либо реальные выводы. Вы говорите, что мне нужно реализовать свои собственные виджеты/графики, чтобы заставить их работать так, как я хочу? - person Finitely Failed; 05.07.2013
comment
QSlide не является QGraphicsItem или Object, вы используете его через QGraphicsProxyWidget? Если это так, то существуют различные вещи, которые не передаются реальному виджету, и это может быть одним из них. Что касается вашего вопроса, да, я ожидаю, что вам нужно наследовать от GraphicsItem, чтобы определить его конкретное поведение в ответ на мультитач; по крайней мере, я так делал, когда использовал его в Qt 4.8 - person TheDarkKnight; 05.07.2013
comment
Да, я использую его через QGraphicsProxyWidget. Я могу согласиться с тем, что такие вещи, как касания, не будут передаваться виджетам внутри QGraphicsScene, но я нахожу странным то, что они это делают, например. если я добавлю QSlide в QGraphicsScene, он будет работать, как и ожидалось, с прикосновениями, но одновременное использование двух QSlide не сработает. - person Finitely Failed; 05.07.2013
comment
Я помню, что у меня была аналогичная проблема с прокси-элементами, когда мультитач работал неправильно. В то время мы связались с Qt, но так и не получили удовлетворительного ответа. Это было около полутора лет назад, поэтому в Qt 5 все могло измениться. Однако я реализовал обработку касания, как описано в моем ответе, и обнаружил, что она работает с обычными QGraphicsItems, но не с прокси-виджетами. - person TheDarkKnight; 05.07.2013