根据鼠标所在位置获取组件拿到 “qt_scrollarea_viewport” 组件的问题

问题起因:

有时候需要鼠标实时所在位置的组件,可以通过如下方法实时获取:

cpp 复制代码
QWidget *current_widget = QApplication::widgetAt(QCursor().pos());
qDebug() << __FUNCTION__ << current_widget;

// 如果是按钮,直接进行转换
QPushButton *btn = qobject_cast<QPushButton*>(current_widget )
if (btn)
{
	// process
}

但是在使用过程中,有一个问题,就是在 QTableView、QTreeView 等 view-model 类型的组件中,是拿不到具体的组件的,通过上述方法,只能拿到 object_name = "qt_scrollarea_viewport" 的组件。

cpp 复制代码
// 比如鼠标所在的位置是一个Button,checkbox等常规组件,那没啥问题

// 但是如果是点击的是QTableView 或 QTreeView 等组件就不行,你点击每个Item,都是同一个object

解决方法

QTableView、QTreeView 等 view-model 类型的组件由于视图和模型的关系,使用QApplication::widgetAt(QCursor().pos()) 拿到的是子组件 qt_scrollarea_viewport,它的父组件(parentWidget)才是当前需要的组件。

cpp 复制代码
QWidget *current_widget = QApplication::widgetAt(QCursor().pos());
qDebug() << __FUNCTION__ << current_widget;

if ("qt_scrollare_viewport" == current_widget->objectName())
{
    QWidget *actual_widget = current_widget->parentWidget();
    qDebug() << __FUNCTION__ << actual_widget;
}

参考:qt-find-actual-widget-underneath-viewport-at-coordinates

相关推荐
喜欢吃燃面7 分钟前
C++:list(1)list的使用
开发语言·c++·学习
枫昕柚20 分钟前
python
开发语言·python
Dxy123931021631 分钟前
Python Requests-HTML库详解:从入门到实战
开发语言·python·html
啊阿狸不会拉杆1 小时前
《Java 程序设计》第 7 章 - 继承与多态
java·开发语言·jvm·算法·intellij-idea
神仙别闹1 小时前
基于QT(C++)实现(图形界面)选课管理系统
java·c++·qt
daixin88481 小时前
SpringMVC的请求执行流程是什么样的?
java·开发语言·spring
手握风云-2 小时前
JavaEE初阶第十二期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(十)
java·开发语言·java-ee
「QT(C++)开发工程师」2 小时前
Qt C++动态库SDK在Visual Studio 2022使用(C++/C#版本)
c++·qt·c#·visual studio
awonw2 小时前
[python][flask]Flask-Principal 使用详解
开发语言·python·flask
潼心1412o2 小时前
C语言(长期更新)第6讲:函数
c语言·开发语言