QTableView的indexAt使用方法
2013-10-13 21:41
1301 查看
要实现的功能是QTableview中Item项上右键弹出菜单
这就必然要判断点击右键时鼠标指针是否在QTableView的Item上
如果是QTableWidget可以用itemAt来判断
QTableView通过查看文档 发现有个indexAt函数 返回QModelIndex
于是通过如下代码判断鼠标右键单击的时候,鼠标指针是否在item上
可是发现一些问题:
当鼠标右键点击第一行的上边缘附近 返回0
点击第一行中间 返回1
点击最后一行中间就返回 -1
也就是说 点击行A的上边缘附近 返回的是A的上一行
只有点击行A的中间返回的才是A行
并不是 indexAt函数所描述的那样返回的是当前行
最后发现问题出在:
indexAt函数根据QPoint判断行的时候 是没有把 QTableView的表头去掉的 (HoriziotalHeader和VerticalHeader)
所以 隐藏表头后 就一切正常了
如果不愿意隐藏表头 我是用如下代码 解决的:
现在debug输出就一切正常了(上面只是针对QtableView上面的horizontal表头不隐藏,如果竖直方向的也没隐藏,那么也要加上其宽度)。
以上就是我解决问题的过程。
来自我在qtcn.org上发表的一个帖子:http://www.qtcn.org/bbs/read-htm-tid-55107.html
这就必然要判断点击右键时鼠标指针是否在QTableView的Item上
如果是QTableWidget可以用itemAt来判断
QTableView通过查看文档 发现有个indexAt函数 返回QModelIndex
QModelIndex QTableView::indexAt(const QPoint & pos) const [virtual] Reimplemented from QAbstractItemView::indexAt(). Returns the index position of the model item corresponding to the table item at position pos in contents coordinates.
于是通过如下代码判断鼠标右键单击的时候,鼠标指针是否在item上
qDebug()<<ui->tableview->indexAt(ui->tableview->mapFromGlobal(QCursor::pos())).row();
可是发现一些问题:
当鼠标右键点击第一行的上边缘附近 返回0
点击第一行中间 返回1
点击最后一行中间就返回 -1
也就是说 点击行A的上边缘附近 返回的是A的上一行
只有点击行A的中间返回的才是A行
并不是 indexAt函数所描述的那样返回的是当前行
最后发现问题出在:
indexAt函数根据QPoint判断行的时候 是没有把 QTableView的表头去掉的 (HoriziotalHeader和VerticalHeader)
所以 隐藏表头后 就一切正常了
如果不愿意隐藏表头 我是用如下代码 解决的:
QPoint pt = ui->tableview->mapFromGlobal(QCursor::pos()); int height = ui->tableview->horizontalHeader()->height(); QPoint pt2(0,height); pt+=pt2; qDebug()<<ui->tableview->indexAt(pt).row();
现在debug输出就一切正常了(上面只是针对QtableView上面的horizontal表头不隐藏,如果竖直方向的也没隐藏,那么也要加上其宽度)。
以上就是我解决问题的过程。
来自我在qtcn.org上发表的一个帖子:http://www.qtcn.org/bbs/read-htm-tid-55107.html
相关文章推荐
- 【104】Maven3.5.0结合eclipse使用,提示Lambda expressions are allowed only at source level 1.8 or above错误的解决方法
- 使用RDP时发生AtBroker.exe error的解决方法
- CSS z-index 属性的使用方法和层级树的概念
- z-index使用以及失效的处理方法
- [ActionScript 3.0] 用TextField的方法getCharIndexAtPoint(x:Number, y:Number):int实现文字在固定范围内显示
- 使用GreenDao报错:Caused by: java.lang.IllegalArgumentException: the bind value at index 1 is null
- Range<String.Index> String.Index 使用方法
- Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at SimpleCalculator.main的解决方法
- js indexOf使用方法
- vector<>中的访问成员方法用at(index)
- CSS z-index 属性的使用方法和层级树的概念
- CSS z-index 属性的使用方法和层级树的概念
- Linux系统任务计划(at、crontab)的使用方法
- CSS z-index 属性的使用方法和层级树的概念
- dede autoindex自增标签使用方法
- AngularJS使用 ng-repeat 中的 $index与替代方法
- CSS z-index 属性的使用方法和层级树的概念
- 使用kxml2-min-2.3.0.jar时的错误解决方法:Missing stack map in: <init> at label: 79
- CSS z-index 属性的使用方法和层级树的概念
- - (void)insertObjects:(NSArray *)objects atIndexes:(NSIndexSet *)indexes使用方法