如何使用 Qt 扩展策略在布局中找到 QWidget 的真实高度?

How to find the true height of a QWidget inside a layout with Qt expanding policy?

我的Qt程序有一个window,在window里面有一个QVBoxLayout布局。我使用 Qt::Expanding 大小策略向布局添加了 QLabel。这是代码。

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();
}

我想在 window 中使用真实大小的 QLabel,这样我就可以为其计算字体大小。但是当我尝试使用 QLabel::height() 获取大小时,无论 window 大小是多少,它总是给我相同的数字。例如,当 window 大小为 (700, 700) 时,它给出 height = 480 width = 640。当我将 window 大小设置为 (1000, 1000) 时,它会打印相同的内容。如何获得 QLabel 的真实值?

我还测试了 sizeHint,它的作用类似于 height()

问题是 QWidget::resize 不会在隐藏小部件时立即调整小部件的大小:

If the widget is visible when it is being resized, it receives a resize event (resizeEvent()) immediately. If the widget is not currently visible, it is guaranteed to receive an event before it is shown.

所以,当小部件仍然隐藏时,QLabel::height()仍然是returns它的初始值,即QLabel::sizeHint()

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

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

你可以自己实现继承自QWiget的widget,重新实现QWidget的函数showEvent(QShowEvent*)resizeEvent(QResizeEvent*),就可以在这些里面得到真实的标签高度功能。