Qt onClicked和onDoubleClicked都发生在QML中
我已经将Qt onClicked和onDoubleClicked都发生在QML中,qt,qml,qtquick2,Qt,Qml,Qtquick2,我已经将onClick和onDoubleClick处理程序添加到QML中的一个项目中,但是当我双击该区域时,这两个事件都会执行。我不知道这是否与检查点击是否由鼠标右键生成有关。此外,放置代码的顺序也不会影响问题 MouseArea { id: idModuleMouseDebug; parent: repeaterDelegate; anchors.fill: parent; acceptedButtons: Qt.LeftButton | Qt.RightBut
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所说,这也是widgets世界的预期行为:
#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();
}
想想你预期的行为将如何实现。为了在最终是双击时不发出单键单击,您需要推迟发出单键单击,直到双击延迟/阈值过去,如果没有第二次单击,则必须人工延迟发送单键单击事件。这将是一片混乱。您应该使用阈值进行单击,如下所示:
{
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()
}
}
}
}
似乎是这个错误的回归:但不清楚,因为它说“双击时两个事件都会执行”,这是预期的行为。@cdonts我想这是清楚的!如果单击一次,将调用
onClick
。如果我双击,onClick
和onDoubleClick
都会被调用!伙计,冷静点。你不需要喊每一句话。当你说“很明显,当我点击一次时,双击事件不应该出现!”时,你显然自相矛盾-它没有这样做。如果单击一次,则只打印“单次单击”。这就是@cdonts所指出的。此外,它们是正确的:行为是预期的。这将导致您单击的时间与界面响应的时间之间出现明显的延迟(例如,如果是按钮)。@Mitch我知道,但TS希望将单击和双击分开(据我所知)虽然双击总是在单击后工作。我希望我永远不必使用此UI:p@Mitch错了!微调计时器可以提供很好的效果,您不会注意到它
{
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()
}
}
}
}