最近在做QT项目中,测试提了一个关于QTreeView的BUG:选中某条记录时,在TreeView中空白处(暂且叫A点)点击右键弹出菜单,菜单中的某些选项不对,原因是点击右键A点时,没有让选中状态为非选中状态(windows的操作行为是这样的)
开始的思路是:点击处的位置能知道,然后得到当前所有记录的占用的Rect大小,就能确定A点是非位于Rect内,但在确定Rect的大小不是件容易的事,主要是高度问题
总高 = 记录数*每行高度;
或首行左上角到未行右下角
在测试上面的过程中,发现文档中的indexAt ( const QPoint & ) const : QModelIndex能很好解决这样问题,不用去计算A点是否在Rect内,只要确定调用indexAt是否能返回有效的index即可
那就重载mousePressEvent中调用它吧
void ImTreeView::mousePressEvent(QMouseEvent * event)
{
if(event->button()&Qt::RightButton)
{
int xPos = event->x();
int yPos = event->y();
// 返回点击处所在的记录
QModelIndex idx = indexAt(QPoint(xPos, yPos));
if (!idx.isValid())
{
setCurrentIndex(idx);
}
// else cont
}
QTreeView::mousePressEvent(event);
}
阅读(4514) | 评论(0) | 转发(0) |