QAbstractItemView区分单双击

 

系统不可能知道你这一次单击鼠标是为了双击指令,所以在你第一次按下鼠标时,系统会发出一个WM_XBUTTONDOWN(也就是clicked),

当你第二次单击鼠标时,系统先发送WM_XBUTTONDOWN,然后发现距离上一次单击鼠标间隔不到N毫秒(注册表中设置),于是发出双击消息,程序收到消息,调用doubleClicked

QWidget中一次双击只会触发一次单击和一次双击事件。

而在QAbstractItemView中,如果设置void setEditTriggers ( EditTriggers triggers ) 禁用了双击鼠标编辑功能,则:

一次双击中调用次序是clicked、doubleClicked、clicked。

解决双击会触发两次单击,方法:

https://wenku.baidu.com/view/7a6e9b5d03d8ce2f01662342.html

#include "testclick.h"
#include <qdebug.h>
#include <QKeyEvent>
#include <QStringListModel>

TestClick::TestClick(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
    ui.setupUi(this);

    m_pTimer = new QTimer(this);
    m_bDouble = false;



    QStringList leaders;
    leaders<<"qq"<<"aa"<<"zz"<<"ww"<<"ss"<<"xx";
    QStringListModel *model = new QStringListModel();
    model->setStringList(leaders);
    ui.listView->setModel(model);
    ui.listView->setEditTriggers(QAbstractItemView::NoEditTriggers);

    connect(ui.listView,SIGNAL(clicked(const QModelIndex&)),this, SLOT(slot_click(const QModelIndex&)));
    connect(ui.listView,SIGNAL(doubleClicked(const QModelIndex&)),this, SLOT(slot_DbClick(const QModelIndex&)));
    connect(m_pTimer, SIGNAL(timeout()),this, SLOT(slot_timeOut()));

}

TestClick::~TestClick()
{

}


void TestClick::slot_click(const QModelIndex& mi)
{
    //qDebug() << "slot_click";
    if (!m_bDouble)
    {
        m_pTimer->start(120);
    }

    m_bDouble = false;
}

void TestClick::slot_DbClick(const QModelIndex& mi)
{
    //qDebug() << "slot_DbClick";
    m_bDouble = true;
    m_pTimer->stop();

    this->run_DbClick();
}

void TestClick::slot_timeOut()
{
    if (!m_bDouble)
    {
        this->run_Click();
    }
}

//单击调用
void TestClick::run_Click()
{

}

//双击调用
void TestClick::run_DbClick()
{

}
原文地址:https://www.cnblogs.com/zhangxuan/p/7765963.html