2016-12-18 4 views
0

Androidでアプリケーションをテストしているうちに、何か不機嫌なことに気付きました。ダブルクリックイベントハンドラは、その特定のアイテムでダブルクリックが発生していない状態でトリガされています。AndroidのMouseAreaからのファントムダブルクリック

問題を特定しようとすると、2つのオブジェクトが2つ目のオブジェクトの2番目のクリックをダブルクリックとして登録するかどうかに関係なく、ワンクリック。

以下は、3つのランダムに色付けされた矩形の行から成り立っており、それぞれの中にマウス領域がある例です。各マウス領域のダブルクリックは、親矩形の色を異なるランダムな色に設定するために調整されます。アンドロイドの下で2つの異なる長方形をすばやくクリックすると、ダブルクリックと2番目の色の変更がトリガーされます。これは、WindowsやUbuntu Linuxでは発生しません。

Window { 
    id: main 
    visible: true 
    width: 400 
    height: 400 
    title: qsTr("Hello World") 

    Row { 
    Rectangle { 
     width: main.width * .33 
     height: main.height 
     color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1) 
     border.color: "black" 
     border.width: 2 
     MouseArea { 
     anchors.fill: parent 
     onDoubleClicked: parent.color = Qt.rgba(Math.random(), Math.random(), Math.random(), 1) 
     } 
    } 
    Rectangle { 
     width: main.width * .33 
     height: main.height 
     color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1) 
     border.color: "black" 
     border.width: 2 
     MouseArea { 
     anchors.fill: parent 
     onDoubleClicked: parent.color = Qt.rgba(Math.random(), Math.random(), Math.random(), 1) 
     } 
    } 
    Rectangle { 
     width: main.width * .33 
     height: main.height 
     color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1) 
     border.color: "black" 
     border.width: 2 
     MouseArea { 
     anchors.fill: parent 
     onDoubleClicked: parent.color = Qt.rgba(Math.random(), Math.random(), Math.random(), 1) 
     } 
    } 
    } 
} 

ダブルクリックを検出するために使用されることになっています「前のクリック」または任意のプロパティではなく、マウス面積あたりであることの別のマウスの領域の間で共有されているかのように見えます。この問題は、Qt 5.7と5.7.1の両方に現れます。

私の10回目の今年はQtのバグを発見したようですが、確かに見えますが、私は、これは固定必要があるため、私はまだ、誰かが何が起こっているか、それを修正する方法を知っている奇妙な偶然に尋ねるように感じる、とQtのバグ報告プロセスではありません迅速です。だから、どんなアイデアも大歓迎です。

答えて

1

実際の解決策ではより良い答えが得られるまで、ダブルクリック検出のグローバルな間隔を減らすことで、この問題がユーザーエクスペリエンスに与える壊滅的な影響を多少軽減できます。

デフォルトでは、それはちょっと贅沢な500ミリ秒です。 MouseAreaの「固定」のコピーを作成するために迅速かつハックQML-唯一の方法であり、さらに

QGuiApplication app(argc, argv); 
app.styleHints()->setMouseDoubleClickInterval(250); 

:私は250ミリ秒にそれを減らすことによって、誤ったダブルクリックの90%以上を回避するのに役立つことが判明しました:

// MArea.qml 
Item { 
    id: main 
    property alias mouseX : ma.mouseX 
    property alias mouseY : ma.mouseY 
    property alias acceptedButtons: ma.acceptedButtons 
    // etc aliases 
    signal clicked(var mouse) 
    signal doubleClicked(var mouse) 
    // etc signals, function accessors 
    MouseArea { 
    id: ma 
    property real lClick : 0 
    anchors.fill: parent 
    onClicked: { 
     var nc = Date.now() 
     if ((nc - lClick) < 500) main.doubleClicked(mouse) 
     else main.clicked(mouse) 
     lClick = nc 
    } 
    } 
} 

この1つは実際に意図したとおりに動作し、ほぼ完全に行うことができる「プラグアンドプレイ」オリジナルのものと互換性があります。

関連する問題