0

QGraphicsView に追加したいくつかの QWidget でマルチタッチを動作させるのに苦労しています。QGraphicsScene と QGraphicsView を設定する QWidget のサブクラスを作成しました。これは私の(テスト)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 は最初のタッチを処理するかもしれませんが、2 回目、3 回目、4 回目などの同時タッチで何をしたいのかわかりません。たとえば、アプリで 2 回目のタッチ移動で次のいずれかを実行する必要がある場合があります。

1) 最初の項目が終わったオブジェクトを回転させる

2) 最初のアイテムがオーバーしているオブジェクトをスケーリングします

3) 2 番目の項目を選択します

4) ビューを翻訳する

5) など

したがって、やりたいことを実行するには、連続したタッチを処理する必要があります。また、Qt の Gestures も参照してください。

于 2013-07-04T08:19:04.623 に答える