Qt QTableWidget itemAt()函数不得不知的点 (右键菜单)

  • A+
所属分类:Qt专栏 Qt经验集

最近使用了下Qt的表格功能,使用的就是这个QTableWidget界面类,想实现右击某一条目,弹出自定义的菜单项功能,网上搜索了下,大致的思路都是一样的,即,首先创建好QMenu和QAction,并绑定好QAction的响应事件,然后重写QTableWidget的父界面的contextMenuEvent(QContextMenuEvent *event)函数,这个函数是widget的右击菜单事件的函数,其中event即捕获到的右击事件,利用pt = event->pos()获取右击时鼠标的位置,然后利用QTableWidget的itemAt(pt)函数来判断鼠标右击的位置是在表格中还是表格外的其他地方,如果在表格中itemAt(pt)的返回值不为null,显示菜单项;否则,为null,不显示菜单项。

右键item,却不显示菜单项问题

但在实际使用的时候,却发现,点击QTableWidget的靠上一点的位置时,右键可以显示出菜单项,但是,如果在QTableWidget的偏下一点的位置右击,不显示菜单项。这是由于pt = event->pos()和QTableWidget的itemAt(pt)这两个坐标点的参考坐标不一致决定的,event->pos()获取的坐标是相对于重载该函数的界面类而言的,itemAt(pt)是相对于QTableWidget本身而言的,(另外用到的QCursor::pos()是全局的,相对整个软件界面而言的),正是因为坐标选用的参考系不一致,所以,出现了上述现象。

解决办法:

方法1:重写QTableWidget的contextMenuEvent(QContextMenuEvent *event)的事件,而不是父界面的,建议在使用QTableWidget创建表格前写,否则,表格功能一旦写好了,再采用这样的方法去修改比较麻烦,因为要将表格换一个重写的新类来实现

方法2:采用mapFromGlobal()方法去对坐标系进行转换

方法3:绑定QTableWidget的customContextMenuRequested(const QPoint & pos )信号,前提是先对QTableWidget对象设置setContextMenuPolicy(Qt::CustomContextMenu);然后再对该信号进行信号槽绑定,使用customContextMenuRequested(const QPoint & pos )信号中的pos来给itemAt(pt)函数传参,这样,两个点的坐标系是一致的,就可以用itemAt(pt)函数来判断右击位置是否在表格中的有效区域(因为,有时表格数据项比较少,表格中就会出现空白区域),下图是绑定该信号的槽函数写法。Qt QTableWidget itemAt()函数不得不知的点 (右键菜单)

Qt大课堂-QtShare

发表评论

您必须登录才能发表评论!