4

次のコードを検討してください。

#include <QWidget>
#include <iostream>
#include <QApplication>

class Widget : public QWidget
{
public:
    void mousePressEvent(QMouseEvent* event)
    {
        std::cout << "mousePressEvent" < std::endl;
    }

    void mouseDoubleClickEvent(QMouseEvent* event)
    {
        std::cout << "mouseDoubleClickEvent" << std::endl;
    }
};

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    Widget w;
    w.show();
    return app.exec();
}

ダブルクリックを処理するたびに、出力は次のようになります。

mousePressEvent
mouseDoubleClickEvent

これは、Qt が 2 回目のプレスを待たずに 1 つのプレスが進むとすぐに常に mousePressEvent を呼び出すことを意味します。このオプションをオフにして、ダブルクリックの場合に mousePressEvent 呼び出しが実行されないようにする方法はありますか?

4

3 に答える 3

3

QTimer値に等しい期間、シングル クリック イベントの処理を ( を使用して) バイパスしQApplication::doubleClickInterval()ます。その間にダブルクリックが発生しなかった場合は「シングルクリック」を処理する必要があり、それ以外の場合はダブルクリックを処理する必要があります。

于 2015-05-15T15:12:57.163 に答える
0

各イベント関数で 1 ずつインクリメントしないのはなぜですか? ダブルクリックの場合、カウンターは 1 ずつ 2 回増加します。

より一般化された解決策:追加された値を減算することによって行われた変更を排除しmousePressEventます (負になることもあります)。

void mousePressEvent(QMouseEvent* event)
{
    counter += singleClickStep;
}

void mouseDoubleClickEvent(QMouseEvent* event)
{
    counter -= singleClickStep;
    counter += doubleClickStep;
}

singleClickStepdoubleClickStepは、それぞれの場合にカウンターをインクリメントする値です。

Vahancho の回答は、シングル クリックで行ったことを元に戻すことができないが、QApplication::doubleClickInterval()長すぎる可能性がある場合を解決します。一方、私のソリューションでは、ウィジェットの最初のクリックと 2 番目のクリックの間に値が表示されます。

于 2015-05-15T15:11:27.173 に答える