QT自定义控件类,无法获取真实宽度和高度

2023-10-27

问题:

自定义控件类,无法获取真实的高度和宽度。代码如下:

//头文件 
#ifndef ROUNDEDTOOLTIP_H
#define ROUNDEDTOOLTIP_H

#include <QWidget>
#include <QLabel>

class RoundedToolTip : public QWidget {
    Q_OBJECT

public:
    explicit RoundedToolTip(const QString &text, QWidget *parent = nullptr);

private:
    QLabel *m_label;
};

#endif // ROUNDEDTOOLTIP_H



//cpp文件
#include "roundedtooltip.h"

RoundedToolTip::RoundedToolTip(const QString &text, QWidget *parent)
    : QWidget(parent) {
    setWindowFlags(Qt::ToolTip | Qt::FramelessWindowHint);
    setAttribute(Qt::WA_TranslucentBackground);

    m_label = new QLabel(this);
    m_label->setText(text);
    m_label->setAlignment(Qt::AlignCenter);

    m_label->setStyleSheet(styleSheet);
}

当我new一个如上的自定义控件类,并设置m_label的text时,然后我尝试获取m_label的宽度。

结果发现,实际宽度和获取的宽度有明显的偏差。

原因:

1、qwidget下面直接放了一个label,没有进行布局,导致的。

针对这个问题,修改后代码如下:

#include <QVBoxLayout>
#include "roundedtooltip.h"


RoundedToolTip::RoundedToolTip(const QString &text, QWidget *parent)
    : QWidget(parent) {
    setWindowFlags(Qt::ToolTip | Qt::FramelessWindowHint);
    setAttribute(Qt::WA_TranslucentBackground);

    QVBoxLayout *layout = new QVBoxLayout(this);
    m_label = new QLabel();
    m_label->setText(text);
    m_label->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
    m_label->setAlignment(Qt::AlignCenter);
    layout->addWidget(m_label);

    m_label->setStyleSheet(styleSheet);
    this->layout()->setContentsMargins(0,0,0,0);
}

double RoundedToolTip::getActualWidth()
{
    return m_label->width();
}

void RoundedToolTip::setToolTipText(QString tooltip)
{
    m_label->setText(tooltip);
}


对QWidget进行布局,手动添加一个QVBoxLayout。这时获取宽高就能正常了。

2、若还是不行,可以重写qwidget的showEvent事件,然后在触发信号,在接受信号事件中,获取宽度。代码类似这样:

#include <QWidget>
#include <QShowEvent>

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    MyWidget(QWidget *parent = 0) : QWidget(parent) {}

protected:
    void showEvent(QShowEvent *event) override {
        QWidget::showEvent(event);
        // 在这里,你可以安全地获取widget的真实尺寸
        int width = this->width();
        emit widgetRendered(width);
    }

signals:
    void widgetRendered(int width);
};

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT自定义控件类,无法获取真实宽度和高度 的相关文章

  • 在 4K 屏幕上使用 Matplotlib 和 TKAgg 或 Qt5Agg 后端

    我在 Ubuntu 16 04 上使用 Matplotlib 2 0 和 Python 3 6 来创建数据图 电脑显示器的分辨率为 4k 分辨率为 3840x2160 绘图数字看起来非常小 字体也很小 我已经尝试过TKAgg and Qt5
  • Qt 5.5 QOpenGLWidget 链接错误未链接任何 openGL 调用

    我尝试使用 Qt 5 5 1 构建一个简单的 OpenGL 应用程序 一切都很好 直到我尝试使用 glClearColor 等 openGL 本机函数调用 该小部件实际上编译并产生黑屏 但在我尝试使用任何 openGL 本机函数后 它甚至不
  • 另一个宏中的 Q_PROPERTY 宏

    如何放置Q PROPERTY另一个宏里面 辅助宏 define SimpleAllinOne member type public void Set member type arg member m member arg member ty
  • 如何在Qt无框窗口中实现QSizeGrip?

    如何使用 Qt 无框窗口实现 QSizeGrip 代码会是什么样的 您只需在布局内窗口的一角添加 QSizeGrip 即可使其保持在该角落 QDialog dialog new QDialog 0 Qt FramelessWindowHin
  • QPainter 性能高帧率

    我试图在 QPainter 中以 60fps 的速度显示视频 在 OpenGLwidget 中 我遇到一个问题 有时绘图花费的时间太长 并且在使用 QPainter 时发生下一个重绘事件 这会生成警告和随机崩溃 有几个问题 是否有一种 Qt
  • 具有多个父项的 Qt 树模型

    我想构建一棵树 其中一个元素可以引用另一个元素 我想要构建的树是 像这样的东西 A B C D E F P this is a pointer to C D first child of C E second child of C I fo
  • 使用 QTextCursor 选择一段文本

    使用 Qt 框架选择文本片段时遇到问题 例如 如果我有这个文件 没有时间休息 我想选择 ime for r 并从文档中删除这段文本 我应该如何使用 QTextCursor 来做到这一点 这是我的代码 QTextCursor cursor n
  • 仅在发布模式下使用 glGenBuffer 时出现未处理的异常 - QT

    我在 Windows 7 上使用 Qt 4 8 发布模式编译项目时遇到了一些问题 调试时一切正常 但在发布时我收到未处理的异常 0xC0000005 访问冲突 我将范围缩小到发生这种情况的行 即生成像素缓冲区的时间 我的第一个猜测是 DLL
  • Qt5和QML:如何使用WebEngine Quick Nano浏览器自动输入用户名和密码

    我正在使用编写一个小应用程序Qt and QML使用 Qt 文档中的示例WebEngine Quick Nano 浏览器 https doc snapshots qt io qt5 5 9 qtwebengine webengine qui
  • QML:无法读取未定义的属性“xxx”

    ApplicationWindow id root property string rootName rootName visible true width 800 height 400 title qsTr WatchFace Maker
  • 仅在内部/外部抚摸路径?

    Given a QPainterPath http qt project org doc qt 4 8 qpainterpath html如何仅在路径的内侧或外侧边缘 或非闭合路径的左侧或右侧 描边路径 QPainter strokePat
  • Qt 人工鼠标点击无法正常工作

    小玩具应用程序可以在这里找到 http gist github com 517445 http gist github com 517445 我正在尝试将人工鼠标事件发送到小部件 我使用QApplication sendEvent为此 接下
  • 如何让小部件在上下文菜单出现时接收鼠标释放事件

    在Ubuntu20 04上 当上下文菜单出现时 我无法让小部件接收鼠标释放事件 而Windows可以接收 我的pyqt版本是5 15 2 我考虑过手动发送鼠标释放事件 但我不知道当上下文菜单出现时哪些系统会收到鼠标释放事件 这样做可能会导致
  • 清除pyqt中布局中的所有小部件

    有没有办法清除 删除 布局中的所有小部件 self plot layout QtGui QGridLayout self plot layout setGeometry QtCore QRect 200 200 200 200 self r
  • QML 中可重用的字体属性[重复]

    这个问题在这里已经有答案了 在 QML 中 我希望能够定义一组字体属性以进行简单的语义重用 例如 代替 Text text This is a header font family Encode Sans weight Font Black
  • 连接到 QNetworkReply::error 信号

    我正在使用 Qt5 的新连接语法 QNetworkReply 有一个名为error http qt project org doc qt 5 0 qtnetwork qnetworkreply html error 2还有一个函数叫做err
  • Qt QML 数据模型似乎不适用于 C++

    我一直在使用中的示例http doc qt digia com 4 7 qdeclarativemodels html http doc qt digia com 4 7 qdeclarativemodels html这是 QML 声明性数
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • Qt 支持 Windows 蓝牙 API 吗?

    谁能告诉我 Qt 是否支持 Windows 蓝牙 API 如果是这样 您能否分享一些有关如何使用它的信息 自上次答复以来 这个问题的答案发生了一些变化 Qt 5 2 版为 Linux BlueZ 和 BlackBerry 设备实现了蓝牙 A
  • Q风格所有权

    在 Qt 应用程序中使用样式时 我遇到了一个有趣的问题QStyle所有权 QStyle继承自QObject 通常接受QObject parent作为构造函数参数来管理其子级的生命周期 但QStyle的构造函数没有此构造函数参数 第一个问题

随机推荐

  • WebGL射线拾取模型——八叉树优化

    经过前面2篇WebGL射线拾取模型的文章 相信大家对射线和模型面片相交的原理已经有所了解 那么今天我们再深入探究关于射线拾取的一个问题 那就是遍历场景中的所有与射线相交的模型的优化问题 首先我们来复习一下射线拾取模型的原理 请看下图 我们从
  • ELK 日志系统收集K8s中日志

    容器特性给日志采集带来的困难 K8s弹性伸缩性 导致不能预先确定采集的目标 容器隔离性 容器的文件系统与宿主机是隔离 导致日志采集器读取日志文件受阻 日志按体现方式分类 应用程序日志记录体现方式分为两类 标准输出 输出到控制台 使用kube
  • 人工智能算法 上市公司,人工智能算法公司排名

    人工智能上市公司龙头股票有哪些 一 科大讯飞 002230 属于人工智能稀缺标的 多领域布局苦尽甘来 业绩拐点临近 二 浪潮信息 000977 人工智能基础设施提供商 目前具备业界最全CPU服务器产品线 三 中科曙光 603019 含着金钥
  • 第十二章 内中断

    引言 本书主要讲解硬件中断 12 1 内中断的产生 12 2 中断处理程序 12 3 中断向量表 中断向量表在内存中存放 对于8086PC机 中断向量表指定存放在内存地址0处 从内存0000 0000到0000 03FF的1024个单元中存
  • 微信小程序npm构建

    步骤 一 初始化 npm init y 自动生成生成package json文件 二 project config js配置项 packNpmManually false packNpmRelationList packageJsonPat
  • error: No rule to make target ‘...‘. Stop. 解决方案

    一 error 二 解决方案 第一步 删除 xxx pro 文件中的 RESOURCES xxx qrc 然后 CTRL S 保存文件 第二步 重新添加资源文件 注 文件名不要使用中文 以避免未知的错误 三 环境
  • 类成员函数创建线程

    include
  • iOS--伪后台(安卓与iOS区别)

    1 后台机制方面的区别 提到后台 大家应该会很容易想到安卓的真后台了吧 所谓真后台 就是像PC一样 将应用保留在RAM中 当你使用HOME键退出应用 程序实际上并没有完全退出 而是被系统挂在了后台 比如一些聊天软件 之所以关闭后依然能够收到
  • 注意力机制详述

    学习本部分默认大家对RNN神经网络已经深入理解了 这是基础 同时理解什么是时间序列 尤其RNN的常用展开形式进行画图 这个必须理解了 这篇文章整理有关注意力机制 Attention Mechanism 的知识 主要涉及以下几点内容 1 注意
  • Django 项目使用 Bootstrap 的导入方式

    Django 项目中导入 Bootstrap 是固定的 补充 1 Django 项目的 html 文件中必须先写 meta 再引入其他内容 并且对于导入 JS 的先后顺序有比较严格的要求 补充 2 Django 项目表单中使用POST的方法
  • C++ 对象模型

    C 对象模型 虚函数机制 实现执行器绑定 虚基类机制 实现多继承体系中只有一个共享实体 非静态数据成员放在 object 之中 静态数据成员放在 object 之外 静态和非静态成员函数都放在 object 之外 每个类会产生一堆指向虚函数
  • 表单--form对象

    在Javascript 中 页面上的每一对
  • AAAI 2021

    作者 孙宇冲 单位 中国人民大学 多模态学习旨在使计算机拥有处理不同来源信息的能力 近年来成为了人工智能领域的研究热点 多模态学习将不同模态信息进行融合 学习不同模态信息之间的关联 人类对信息的处理其实也是多模态的 如人可以同时利用视觉和听
  • 爬虫的原理(基本流程,Request与Response,怎么解决JavaScript渲染的问题,怎么保存数据)

    什么是爬虫 爬虫就是请求网站并提取数据的自动化程序 爬虫基本流程 1 发起请求 通过HTTP库向目标站点发起请求 即发送一个Request 请求可以包含额外的headers等配置信息 等待服务器响应 2 获取响应内容 如果服务器能正常响应
  • SilverLight通过Net.TCP(NetTCPBinding)方式调用WCF服务

    在SilverLight中通过标准的BasicHttpBinding来调用WCF服务是非常容易的 只要通过VS的添加服务引用功能添加一下就直接能用了 但是通过net tcp绑定来调用则相当麻烦 一 创建解决方案 首先在VS中创建一个新的Si
  • 消息队列之RabbitMQ介绍与运用

    RabbitMQ 说明 本章 我们主要从RabbitMQ简介 RabbitMQ安装 RabbitMQ常用命令 RabbitMQ架构模式 RabbitMQ使用 Quick RabbitMQPlus的使用和RabbitMQ总结这几个方面对Rab
  • 实变函数与泛函分析(一)集合论

    文章目录 为什么需要实变函数 集合论 集合的表示与运算 上极限 下极限集合 对等与基数 伯恩斯坦 定理可数 不可数集合 度量空间与欧氏空间 聚点内点界点 开集闭集 为什么需要实变函数 对于微积分 其有一个非常明显的不足 黎曼意义下可积函数的
  • vintage、迁移率、滚动率、入催率等概念——看完你就懂了

    随着互联网金融的发展 对数据分析的需求越来越大 数据分析的目的其实是为了找到风险和收益的平衡点 高收益伴随着高风险 而低风险的回报又如同鸡肋 所以 太高的风险 太低的收益都不行 平衡点通俗来讲就是风险在控制范围之中 收益也可以接受 为了找到
  • ebay的api开发技术说明,有点乱

    使用eBay API的基本步骤引入 开始eBay API 例如 以下基本步骤需要 1 注册开发者账号 https developer ebay com join Default aspx 2 选择API类型 eBay有大约6种API 开发语
  • QT自定义控件类,无法获取真实宽度和高度

    问题 自定义控件类 无法获取真实的高度和宽度 代码如下 头文件 ifndef ROUNDEDTOOLTIP H define ROUNDEDTOOLTIP H include