系统不可能知道你这一次单击鼠标是为了双击指令,所以在你第一次按下鼠标时,系统会发出一个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() { }