Qt构造函数中无法获取正确控件大小的问题解决

先看一个简单例子,在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

https://blog.csdn.net/weixin_30710457/article/details/95190664?utm_medium=distribute.pc_relevant.none-task-blog-baidulandingword-2&spm=1001.2101.3001.4242

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值