上文介绍了选中信号的处理,本文继续介绍QTreeView的操作处理。
单击、双击的信号槽的写法,以及重写鼠标操作事件的一般方法。
在QTreeView的父类QAbstractItemView内,定义了这一类视图控件的常用信号:
QAbstractItemView.h:
Q_SIGNALS:
void pressed(const QModelIndex &index);
void clicked(const QModelIndex &index);
void doubleClicked(const QModelIndex &index);
void activated(const QModelIndex &index);
void entered(const QModelIndex &index);
void viewportEntered();
void iconSizeChanged(const QSize &size);其中pressed、clicked、doubleClicked分别为按下、单击、双击,比较常用。
上面的信号只能在单击双击操作发生时,进行一些额外的处理。
如果想拦截这些操作,进行判断来执行其他代码,可以继承QTreeView,重写这些事件。
QTreeView.h:
protected:
void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
void mouseDoubleClickEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE;下面是鼠标按下的的重写示例:
void MyTreeView::mousePressEvent(QMouseEvent *e)
{
if( e->button() == Qt::LeftButton ) //是否左键按下
{
QModelIndex index = indexAt(e->pos()); //取出按下点的元素索引index
if( index.isValid() ) //判断index是否有效
{
//你的处理
QVariant data = index.data(Qt::UserRole+1);
}
//如果需要判断组合键,使用下面代码
if(QApplication::keyboardModifiers () == Qt::ControlModifier)
{
//当前CTRL是否按下,根据需要加此情况
}
else if(QApplication::keyboardModifiers() == Qt::ShiftModifier)
{
//当前SHIFT是否按下,根据需要加此情况
}
else
{
//只是左键按下,没有CTRL和SHIFT
//你的处理...
}
}
}其它事件处理函数写法类似。
如果给一个控件同时添加了单击事件和双击事件,那么在触发双击事件前必然会触发单击事件,为了解决这个问题,在网上一顿找,在msdn上找到了微软提供的解决方法:http://msdn.microsoft.com/en-us/library/ms171543(VS.80).aspx。英文好的同学可以不往下看了,:-D。 其主要思想是:单击鼠标时,启动一个Timer,Timer起计时器作用,Time...
单击: 双击: 不会出现双击时单击操作和双击操作都运行的情况。...
...
...
逻辑:第一次单击后,进入计时器方法,指定时间内如果再次单击,则清除上次计时器方法,增加本次计时方法,随后进入双击事件中,再次清除第二次单击的计时器方法,接着执行双击事件中的业务。...
js 实现绑定按钮单击、双击事件: 当同时绑定单击和双击事件时,会触发两次单击事件和一次双击事件: 双击时不想触发单击事件代码: ...
进来项目中需要使用双击/单击行记录来获取数据,将实现的方式记录如下: 初始化时添加:以上那个是单独写的添加单击双击事件,主要使用addListener添加'rowclick'和'rowdblclick'代表单击和双击事件。而初始化配置,只要配置Grid里面的listeners就可以了! 恩,我找了一些资料并且自己也实践了一下,的确能用!,大家互相学习吧 资料...
html中,onclick为单击事件,ondblclick为双击事件 js中定义方法,注意这里用到了定时器来区分单击和双击事件...