成都专业做网站的公司有哪些,潍坊模板建站定制网站,手机主页网站推荐,wordpress有中文官方版提示#xff1a;文章写完后#xff0c;目录可以自动生成#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、QAbstractItemView二、解决问题总结前言
最近开发一个项目遇到了一个问题#xff0c;QTableView同时绑定doubleClicked和clicked信号#xff0c;结果发现… 提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档 文章目录前言一、QAbstractItemView二、解决问题总结前言
最近开发一个项目遇到了一个问题QTableView同时绑定doubleClicked和clicked信号结果发现鼠标左键双击必然先触发一次单击信号鼠标右键双击就不会触发单击信号。我的需求是同时绑定单击和双击信号结果某些场景下同时触发信号我该怎么办呢
这个问题我终于在源代码里找到了答案。 一、QAbstractItemView
QTableView继承这个类它的单击和双击信号就是从这个类触发的。
单击鼠标抬起事件
void QAbstractItemView::mouseReleaseEvent(QMouseEvent *event)
{Q_D(QAbstractItemView);QPoint pos event-pos();QPersistentModelIndex index indexAt(pos);if (state() EditingState) {if (d-isIndexValid(index) d-isIndexEnabled(index) d-sendDelegateEvent(index, event))update(index);return;}bool click (index d-pressedIndex index.isValid());bool selectedClicked click (event-button() Qt::LeftButton) d-pressedAlreadySelected;EditTrigger trigger (selectedClicked ? SelectedClicked : NoEditTriggers);const bool edited click ? edit(index, trigger, event) : false;d-ctrlDragSelectionFlag QItemSelectionModel::NoUpdate;if (d-selectionModel d-noSelectionOnMousePress) {d-noSelectionOnMousePress false;d-selectionModel-select(index, selectionCommand(index, event));}setState(NoState);if (click) {if (event-button() Qt::LeftButton)emit clicked(index);if (edited)return;QStyleOptionViewItem option d-viewOptionsV1();if (d-pressedAlreadySelected)option.state | QStyle::State_Selected;if ((d-model-flags(index) Qt::ItemIsEnabled) style()-styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick, option, this))emit activated(index);}
}重点是下面这几句 if (click) {if (event-button() Qt::LeftButton)emit clicked(index);先不用管它做了什么判断我简略说下只有index有效才会触发单击信号换言之index无效不会触发这个信号。而且必须是鼠标左键点击才行
可以明显看到clicked总是在doubleClicked之前触发。也就是第一次鼠标抬起的时候触发那个时候还没触发双击信号。
双击信号双击事件触发时
void QAbstractItemView::mouseDoubleClickEvent(QMouseEvent *event)
{Q_D(QAbstractItemView);QModelIndex index indexAt(event-pos());if (!index.isValid()|| !d-isIndexEnabled(index)|| (d-pressedIndex ! index)) {QMouseEvent me(QEvent::MouseButtonPress,event-localPos(), event-windowPos(), event-screenPos(),event-button(), event-buttons(), event-modifiers(), event-source());mousePressEvent(me);return;}// signal handlers may change the modelQPersistentModelIndex persistent index;emit doubleClicked(persistent);if ((event-button() Qt::LeftButton) !edit(persistent, DoubleClicked, event) !style()-styleHint(QStyle::SH_ItemView_ActivateItemOnSingleClick, nullptr, this))emit activated(persistent);d-pressedIndex QModelIndex();
}重点是下面这几句
emit doubleClicked(persistent);鼠标双击事件由底层系统触发鼠标左键和右键均可以触发。
由此我们看到当你用鼠标左键单击的时候总会发送一个单击信号一个双击信号而且单击信号一定在双击信号前面。
二、解决问题
其实没有什么问题需要解决本来就可以同时绑定单击和双击信号。严格来说只要你的单击信号和双击信号没有重叠的业务逻辑你就可以无视这个问题。但是有时候偏偏出现我只要双击不要单击的场景怎么办呢
办法还是有的先看下面的函数
int doubleClickInterval QApplication::doubleClickInterval(); // 单位毫秒其实是有双击触发间隔的意思就是只要两次单击在这个时间间隔内就可以触发双击信号要不然就触发两次单击。这个值在Windows上默认是500ms在Mac/Linux上默认是400ms我们暂时不考虑更改这个值但这个值对我们有用。
解决思路也不难触发单击的时候等待这个时间间隔如果间隔内触发了双击就拦截单击信号否则放行。
// 推荐做法使用系统间隔
connect(m_timer, QTimer::timeout, this, MyClass::handleSingleClick);
m_timer.setSingleShot(true);
m_timer.start(QApplication::doubleClickInterval()); // 关键点总结
1、如果你遇到了非解决不可的场景可以考虑我的方法如果你对这个场景无所谓就无需关心。