如何使用 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*)
,就可以在这些里面得到真实的标签高度功能。
我的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*)
,就可以在这些里面得到真实的标签高度功能。