onClicked и onDoubleClicked оба происходят в QML

Вопрос: Я добавил onClick и onDoubleClick обработчики элемента в QML, но и о событиях, получить выполняется при двойном щелчке на области. Я не знаю, связано ли это с проверкой того, были ли клики созданы с помощью правой кнопки мыши. Также порядок размещения кода не влияет на проблему. MouseArea { id: idModuleMouseDebug; parent: repeaterDelegate; anchors.fill: parent;

Вопрос:

Я добавил onClick и onDoubleClick обработчики элемента в QML, но и о событиях, получить выполняется при двойном щелчке на области. Я не знаю, связано ли это с проверкой того, были ли клики созданы с помощью правой кнопки мыши. Также порядок размещения кода не влияет на проблему.

MouseArea { id: idModuleMouseDebug; parent: repeaterDelegate; anchors.fill: parent; acceptedButtons: Qt.LeftButton | Qt.RightButton onDoubleClicked: { if(mouse.button == Qt.RightButton) { console.log(«Double Click»); } } onClicked: { if(mouse.button == Qt.RightButton) { console.log(«Single Click»); } } } Лучший ответ:

Как сказал @cdonts, это ожидаемое поведение в мире виджетов:

#include <QtWidgets> class Widget : public QWidget { public: Widget() {} protected: void mousePressEvent(QMouseEvent *) { qDebug() << «press»; } void mouseReleaseEvent(QMouseEvent *) { qDebug() << «release»; } void mouseDoubleClickEvent(QMouseEvent *) { qDebug() << «double click»; } }; int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }

Вывод:

press release double click release

Подумайте о том, как будет реализовано ваше ожидаемое поведение. Чтобы не выбрасывать один клик, если он был в итоге двойным щелчком, вам нужно было бы отключить выделение одного клика до истечения времени задержки/порога двойного щелчка, и если бы не было второго щелчка, вам пришлось бы искусственно отправить событие с одним кликом поздно. Это было бы беспорядок.

Ответ №1

Вы должны использовать порог для одного клика, например:

{ function singleClick(){ print(«Single click») } function dblClick(){ print(«Double Click») } MouseArea { id: idModuleMouseDebug; parent: repeaterDelegate; anchors.fill: parent; acceptedButtons: Qt.LeftButton | Qt.RightButton Timer{ id:timer interval: 200 onTriggered: singleClick() } onClicked: { if(mouse.button == Qt.RightButton) { if(timer.running) { dblClick() timer.stop() } else timer.restart() } } } }

Оцените статью
Добавить комментарий