问题:
自定义控件类,无法获取真实的高度和宽度。代码如下:
//头文件
#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);
};