首页 > 解决方案 > 如何使用 Qt 扩展策略在布局中找到 QWidget 的真实高度?

问题描述

我的 Qt 程序有一个窗口,在窗口内部,有一个QVBoxLayout布局。我QLabel在布局中添加了Qt::Expanding尺寸策略。这是代码。

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QWidget* window = new QWidget();
    QVBoxLayout* main_layout = new QVBoxLayout(window);
    QLabel* label = new QLabel();
    label->setStyleSheet("background-color: blue");
    label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

    main_layout->addWidget(label);
    window->resize(700, 700);
    qDebug() << "height = " << label->height() << " width = " << label->width();
    window->show();
    return app.exec();
}

我想在窗口中有真实大小的 QLabel,所以我可以计算它的字体大小。但是当我尝试使用 获取大小时QLabel::height(),无论窗口大小是多少,它总是给我相同的数字。例如,当窗口大小(700, 700)height = 480 width = 640. 当我将窗口大小设置为(1000, 1000)它打印相同。我怎样才能得到真正的价值QLabel

我还测试了 sizeHint,它的行为类似于height().

标签: c++qtqt5qwidget

解决方案


问题是,QWidget::resize如果小部件被隐藏,它不会立即调整小部件的大小:

如果小部件在调整大小时可见,它会立即收到一个调整大小事件 (resizeEvent())。如果小部件当前不可见,则保证在显示之前接收到事件。

因此,当小部件仍处于隐藏状态时,QLabel::height()仍会返回其初始值,即QLabel::sizeHint().

QLabel::height()致电后检查window->show()应该可以解决您的问题:

...
window->show();
qDebug() << "height = " << label->height() << " width = " << label->width();
...

推荐阅读