我已将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");
}
}
}
答案 0 :(得分:7)
您应该使用单击阈值,例如:
{
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()
}
}
}
}
答案 1 :(得分:2)
正如@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
考虑如何实现您的预期行为。如果最终双击,为了不发出单击,您需要暂停发出单击直到双击延迟/阈值已经过去,如果没有第二次点击来了,你必须迟到人工发送单击事件。这将是一团糟。