主要看附件代码, 关键点有三,如下:
关键点 1
// 设置 widgetResizable 属性为 false
setWidgetResizable(false);
关键点2
resize, 和show event时, 需要
void CustomScrollArea::updateWidgetSize() {
int maxWidth = 0;
// 遍历所有子控件,找出最宽的控件
for (int i = 0; i < layout->count(); ++i) {
QWidget* widget = layout->itemAt(i)->widget();
if (widget) {
maxWidth = qMax(maxWidth, widget->size().width());
}
}
// 计算 scrollAreaWidgetContents 的高度
int totalHeight = 0;
for (int i = 0; i < layout->count(); ++i) {
QWidget* widget = layout->itemAt(i)->widget();
if (widget) {
totalHeight += widget->height();
}
}
// 设置 scrollAreaWidgetContents 的大小
scrollAreaWidgetContents->setFixedSize(maxWidth, totalHeight);
}
关键点3:
内部item也要有类似处理
void LogItem::updateWidthBasedOnText() {
QFontMetrics fm(font());
int textWidth = fm.horizontalAdvance(m_strContent);
int maxDefaultWidth = 900 - 30;
if (textWidth > maxDefaultWidth) {
setFixedWidth(textWidth + 30);
}
// update();
}
void LogItem::resizeEvent(QResizeEvent* event) {
QWidget::resizeEvent(event);
updateWidthBasedOnText();
}
void LogItem::showEvent(QShowEvent* event) {
QWidget::showEvent(event);
updateWidthBasedOnText();
}