onClicked 和 onDoubleClicked 都发生在 QML 中
onClicked and onDoubleClicked both happen in QML
我已将 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
想想你的预期行为将如何实现。如果 最终 双击,为了不发出单击,您需要推迟发出单击,直到双击 delay/threshold 结束,如果没有第二次点击,您将不得不人为地延迟发送单击事件。会很乱。
您应该使用单击阈值,例如:
{
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()
}
}
}
}
我已将 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
想想你的预期行为将如何实现。如果 最终 双击,为了不发出单击,您需要推迟发出单击,直到双击 delay/threshold 结束,如果没有第二次点击,您将不得不人为地延迟发送单击事件。会很乱。
您应该使用单击阈值,例如:
{
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()
}
}
}
}