Вопрос:
Я добавил 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() } } } }