zoukankan      html  css  js  c++  java
  • QTableview 获取鼠标坐标的item(QModelIndex)

    要实现的功能是QTableview中Item项上右键弹出菜单
    这就必然要判断点击右键时鼠标指针是否在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表头不隐藏,如果竖直方向的也没隐藏,那么也要加上其宽度)。

    以上就是我解决问题的过程。

  • 相关阅读:
    json&display
    postgresql AutoVacuum系统自动清理进程
    postgresql vacuum操作
    C++ 在.h文件中包含头文件和在.cpp文件中包含头文件有什么区别
    ResetEvent、CreateEvent、SetEvent
    《转载》C语言的移位操作符
    《转载》如何使用M6117D看门狗定时器复位系统
    《转载》 Bit,Byte,WORD,DWORD区别和联系
    $.messager.alert
    对一个或多个实体的验证失败
  • 原文地址:https://www.cnblogs.com/whwywzhj/p/10272570.html
Copyright © 2011-2022 走看看