问题描述
在使用右键菜单栏时,希望对同一个点击对象由于界面位置的不同而产生不同的响应,举例如下图:
例如,我的界面中有一个QTabWidget,其中有三个不同的page,page中均为QTableWidget;而我的右键功能有为当前行上面或下面插入行,那么就需要对不同的界面进行不同的响应操作,只有鼠标在该界面时才对该界面进行添加行操作,其他界面均不进行。
该问题的产生在于:右键菜单栏是对于全局进行的操作,在默认情况下会对三个表都进行指定操作,因此需要避免。
解决办法
QWidget* QApplication::focusWidget()函数提供了这样的功能实现;需要注意的是,该函数返回的指针不限于QWidget本身,实际上,当点击QTableWidget时返回的是QTableWidget*类型的指针,这给我们提供了比较两个ui界面是否一致的可能,代码如下:
//获得当前鼠标所在界面(控件)
QWidget *current_focus_widget;
current_focus_widget = QApplication::focusWidget();
if(current_focus_widget == tableWidget){
//此处为需要的命令
}
我所设计的是在当前行上添加行,运行前:
运行后:
可见,只修改了当前所在界面的值,目的达成。
一些试错
QRect curWidget = QRect(ui->tableWidget4->pos()+ui->centralwidget->pos(),ui->tableWidget4->size());
if(curWidget.contains(QMouseEvent::globalPos())){...}
globalPos()返回当前鼠标的全局位置,部分文档如下:
起初不了解上述函数时试图使用定位来解决该问题,最后发现,没有合适的方法,但是期间发现了很多定位的函数,贴出来:
QPoint QMouseEvent::globalPos(); //返回鼠标的全局坐标
QPoint QCursor::pos()[static]; //返回相对显示器的全局坐标,该函数常在右键菜单响应中用
QPoint QMouseEvent::pos(); //返回相对这个widget的位置
QPoint QWidget::pos(); //获得当前目前控件在父窗口中的位置
const QPointF &QMouseEvent::screenPos()const; //和QPoint QMouseEvent::globalPos() 值相同,但是类型更高精度的QPointF
QPoint QWidget::mapToGlobal(constQPoint& pos)const; //将窗口坐标转换成显示器坐标
QPoint QWidget::mapFromGlobal(constQPoint& pos)const; //将显示器坐标转换成窗口坐标
QPoint QWidget::mapToParent(constQPoint& pos)const; //将窗口坐标获得的pos转换成父类widget的坐标
QPoint QWidget::mapFromParent(constQPoint& pos)const; //将父类窗口坐标转换成当前窗口坐标
QPoint QWidget::mapTo(constQWidget* parent,constQPoint& pos)const; //将当前窗口坐标转换成指定parent坐标
Qpoint pt=cursor().pos(); //获取当前鼠标位置
这些函数都可以在Qt的帮助文档里找到,有具体的参数和作用描述,可将其复制粘贴后,在关键字上按 F1 键就可弹出Qt Creator的帮助文档。
参考资料
[1]. Qt中如何获取当前控件类型
[2]. QT学习之QT判断界面当前点击的按钮和当前鼠标坐标
来源:CSDN
作者:Dagger-axe-x
链接:https://blog.csdn.net/m0_46161993/article/details/104552794