TreeView双击事件的bug

3 篇文章 0 订阅

同事使用简单继承自WinForm中的TreeView的控件,在NodeMouseClick事件中实现业务逻辑需求,其中有获取当前结点的Checked属性进行判断后再下一步操作的情况。结果发现在鼠标单击的状况下实现正常,而双击下则不正确,即事件只触发一次,而属性变化两次(UI上也发生变化),导致后一次属性变化不能正确完成业务逻辑代码。这种情况在AfterCheck事件、MouseClick事件下都存在。查询资料后发现,这是TreeView在Vista和Win7系统下存在的一个bug,需要将TreeView屏蔽双击。

public class MyTreeView : TreeView {
  protected override void WndProc(ref Message m) {
  // Suppress WM_LBUTTONDBLCLK
  if (m.Msg == 0x203) { m.Result = IntPtr.Zero; }
  else base.WndProc(ref m);
  }
}


当然,这又引起了一个新问题,即无法双击折叠展开节点了,如需求中不需要在意这个变化,那么这个解决方案仍是可接受的。

在Qt框架中,`QTreeView` 控件是用于显示和编辑具有层次结构的数据的常用组件。`QTreeView` 通常与模型/视图架构结合使用,其中模型(`QAbstractItemModel`的子类)提供数据,而视图则负责展示数据和处理用户交互。 `QTreeView` 控件中的双击事件可以用来触发特定的操作,比如编辑或查看树节点的数据。要捕获双击事件并相应地处理,你需要重写`QTreeView`的`mouseDoubleClickEvent`方法。 以下是一个简单的例子,展示了如何在Qt中处理`QTreeView`的双击事件: ```cpp class MyTreeView : public QTreeView { Q_OBJECT public: MyTreeView(QWidget *parent = nullptr) : QTreeView(parent) { // 这里可以进行一些初始化设置 } protected: // 重写鼠标双击事件处理函数 void mouseDoubleClickEvent(QMouseEvent *event) override { QModelIndex index = indexAt(event->pos()); // 获取点击位置的模型索引 if (index.isValid()) { // 处理有效的模型索引,比如打开或编辑一个项目 // 这里可以调用自定义的处理函数,例如 editItem(index); } QTreeView::mouseDoubleClickEvent(event); // 必须调用基类的实现以保持正常的事件处理 } public slots: void editItem(const QModelIndex &index) { // 实际处理双击事件的槽函数,比如开始编辑流程 } }; ``` 在上面的代码中,我们首先检查双击位置是否对应一个有效的模型索引。如果是,我们可以执行特定的双击操作,比如调用`editItem`槽函数来处理双击事件。最后,不要忘记调用基类的`mouseDoubleClickEvent`,以确保其他默认行为能够正常发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值