先看一个简单例子,在widget 中加入一个button,在构造时打印以及show()函数调用后打印button大小,发现不同。
原因就是因为加了布局的原因,导致在构造结束之后,控件大小会发生改变一次。
解决方案:
- 重写resizeEvent 或 showEvent(推荐)
- show函数 hide函数
- 定时器延时获取
重写resizeEvent 或 showEvent
showEvent在resizeEvnet之后调用,在show函数之前调用,重写这两者都可以获取正确大小。
//头文件
protected:
virtual void showEvent(QShowEvent *event)override;
virtual void resizeEvent(QResizeEvent *event)override;
//CPP文件
void Widget::showEvent(QShowEvent *event)
{
qDebug() << "showEvent Call:"<<button->size()<<"\n";
}
void Widget::resizeEvent(QResizeEvent *event)
{
qDebug() << "resizeEvent Call:"<<button->size()<<"\n";
}
show函数 hide函数
在构造函数中调用show函数后,再调用hide函数,就可以获取正确的控件大小了,而又因为,速度很快所以,看不出来show函数的执行。
qDebug() << "before show: " <<button->size();
this->show();
this->hide();
qDebug() << "after show: " <<button->size();
定时器延时获取
qDebug() << "before timer: " <<button->size();
QTimer::singleShot(1000,this,SLOT(getButtonSize()));
void Widget::getButtonSize()
{
qDebug() << "after timer: " <<button->size();
}
调用一个静态函数,再调用一个槽函数就可以访问了, 但是这种操作还是不够实时。
完整测试源码
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
class QPushButton;
class QVBoxLayout;
class QTimer;
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
QPushButton *button;
protected:
virtual void showEvent(QShowEvent *event)override;
virtual void resizeEvent(QResizeEvent *event)override;
private slots:
void getButtonSize();
private:
QVBoxLayout *layout;
};
#endif // WIDGET_H
#include "widget.h"
#include <QPushButton>
#include <QVBoxLayout>
#include <QDebug>
#include <QTimer>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
button = new QPushButton(tr("TEST"));
layout = new QVBoxLayout();
layout->addWidget(button);
setLayout(layout);
// resize(100,50);
qDebug() << "before timer: " <<button->size();
QTimer::singleShot(1000,this,SLOT(getButtonSize()));
}
Widget::~Widget()
{
}
void Widget::showEvent(QShowEvent *event)
{
qDebug() << "showEvent Call:"<<button->size()<<"\n";
}
void Widget::resizeEvent(QResizeEvent *event)
{
qDebug() << "resizeEvent Call:"<<button->size()<<"\n";
}
void Widget::getButtonSize()
{
qDebug() << "after timer: " <<button->size();
}
参考:
https://blog.csdn.net/wy_553666576/article/details/104965908