根据鼠标所在位置获取组件拿到 “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

相关推荐
kimnoic7 小时前
Python数据库学习心得:SQLite、MySQL、PostgreSQL优缺点
开发语言·python
必须得开心呀8 小时前
python编写带界面的软件,需要安装哪些插件
开发语言·python
沫璃染墨10 小时前
《Qt从零入门系列(十三):QSS样式表详解——从选择器与层叠规则到控件美化实战》
开发语言·css·c++·qt·ui·qt6.3·qss
达子66611 小时前
RUST 图解 第 3 章:通用编程概念(Common Programming Concepts)
开发语言·算法·rust
道尔柯南11 小时前
C++ 面向对象编程入门:类和对象(上)
开发语言·c++·算法
楠楠子呀11 小时前
英语、西语、阿语客户各开一个口:多语言获客的分流方案
开发语言·javascript·ecmascript·跨境电商·whatsapp·营销工具
tachibana211 小时前
使用for range 的时候,它的地址会发生变化吗?
开发语言·后端·golang·go·语法
临床数据科学和人工智能兴趣组12 小时前
正则表达式的基础语法的基本符号
开发语言·人工智能·python·正则表达式·r语言·r语言-4.2.1·workbudyy
王中阳Go12 小时前
Go 后端转 AI:非科班怎么补?一张 3 列路线表(可保存)
开发语言·人工智能·后端·python·golang·大语言模型
geats人山人海12 小时前
java 4继承
java·开发语言