欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Qt如何获得当前界面

程序员文章站 2022-06-11 18:59:09
...

问题描述

  在使用右键菜单栏时,希望对同一个点击对象由于界面位置的不同而产生不同的响应,举例如下图:
Qt如何获得当前界面
  例如,我的界面中有一个QTabWidget,其中有三个不同的page,page中均为QTableWidget;而我的右键功能有为当前行上面或下面插入行,那么就需要对不同的界面进行不同的响应操作,只有鼠标在该界面时才对该界面进行添加行操作,其他界面均不进行。
  该问题的产生在于:右键菜单栏是对于全局进行的操作,在默认情况下会对三个表都进行指定操作,因此需要避免。

  Qt如何添加多级右键菜单

解决办法

  QWidget* QApplication::focusWidget()函数提供了这样的功能实现;需要注意的是,该函数返回的指针不限于QWidget本身,实际上,当点击QTableWidget时返回的是QTableWidget*类型的指针,这给我们提供了比较两个ui界面是否一致的可能,代码如下:

//获得当前鼠标所在界面(控件)
QWidget *current_focus_widget;
current_focus_widget = QApplication::focusWidget();

if(current_focus_widget == tableWidget){
	//此处为需要的命令
}

  我所设计的是在当前行上添加行,运行前:
Qt如何获得当前界面
Qt如何获得当前界面
运行后:
Qt如何获得当前界面
Qt如何获得当前界面
  可见,只修改了当前所在界面的值,目的达成。

一些试错

QRect curWidget = QRect(ui->tableWidget4->pos()+ui->centralwidget->pos(),ui->tableWidget4->size());
if(curWidget.contains(QMouseEvent::globalPos())){...}

globalPos()返回当前鼠标的全局位置,部分文档如下:
Qt如何获得当前界面
  起初不了解上述函数时试图使用定位来解决该问题,最后发现,没有合适的方法,但是期间发现了很多定位的函数,贴出来:

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判断界面当前点击的按钮和当前鼠标坐标

相关标签: Qt