QT Flowlayout - 多行标签问题
QT Flowlayout - issue with multiline labels
我有一个QT布局的小问题。
我有一个工具箱,我想用一些带有说明的可检查按钮填充它。因此,我创建了一个带有 QGridLayout
的 QWidget
,并将 QButton
放在第一个单元格中,将 QLabel
放在第二个单元格中。
这是代码中最重要的部分(我删除了应用中其他不相关代码的依赖项):
QWidget *createCellWidget()
{
QToolButton *button = new QToolButton(this);
button->setCheckable(true);
button->setMinimumSize(57,57);
button->setMaximumSize(57,57);
QWidget *widget = new QWidget(this);
QGridLayout *layout = new QGridLayout(widget);
layout->addWidget(button, 0, 0, Qt::AlignHCenter);
QLabel *lbl = new QLabel("my very long caption");
lbl->setWordWrap(true);
lbl->setAlignment(Qt::AlignCenter);
layout->addWidget(lbl, 1, 0, Qt::AlignTop);
widget->setMaximumWidth(80);
widget->setMinimumWidth(80);
return widget;
}
然后我创建一个 QGridLayout
并用这些控件填充它:
QWidget *itemWidget_FlowControl = new QWidget(this);
QGridLayout *_flowControl_layout = new QGridLayout(itemWidget_FlowControl);
_flowControl_layout->addWidget(createCellWidget(), 0, 0);
这很好用并产生了这个输出:
这个布局不错。不幸的是,如果我放大 window,控件不会 "flow",所以我尝试用流式布局 (here are the source files) 替换 QGridLayout。
现在行为好多了。但是...
这就是我得到的。较长的字幕布局如同 single-lined,因此文本与按钮重叠。
我该怎么做才能让它看起来像以前的样子,但又保持 "flow layout" 的样子?或者您知道 QT 5.2 中是否有任何替代方案?
谢谢
怎么了?
您在使用流式布局方面走在正确的轨道上。
唯一的问题是单元格小部件的内部布局(QGridLayout
在您的情况下)也会响应调整大小事件而拉伸。
解决方案
解决方案非常简单:
Try to limit the stretch of the internal layout.
工厂函数内 QWidget *createCellWidget()
:
[选项 1]
添加lbl->setMaximumWidth(60);
以手动限制标签宽度的拉伸。这使得内部布局不那么“自由”地伸展。
[选项 2]
添加layout->setSizeConstraint(QLayout::SetFixedSize);
以抑制内部布局拉伸。通过这样做,您可能需要手动添加一些换行代码 (\n
) 到您的“超长标题”,以防 Qt 自动确定的标签宽度不适合您的需要。
结果
IMO 最好的方法是使用关闭样式 sheets(流式布局可以)。
只需使用 QButton
,但通过改变麦粒肿来自定义其视图 sheet。
目前没时间写例子
我有一个QT布局的小问题。
我有一个工具箱,我想用一些带有说明的可检查按钮填充它。因此,我创建了一个带有 QGridLayout
的 QWidget
,并将 QButton
放在第一个单元格中,将 QLabel
放在第二个单元格中。
这是代码中最重要的部分(我删除了应用中其他不相关代码的依赖项):
QWidget *createCellWidget()
{
QToolButton *button = new QToolButton(this);
button->setCheckable(true);
button->setMinimumSize(57,57);
button->setMaximumSize(57,57);
QWidget *widget = new QWidget(this);
QGridLayout *layout = new QGridLayout(widget);
layout->addWidget(button, 0, 0, Qt::AlignHCenter);
QLabel *lbl = new QLabel("my very long caption");
lbl->setWordWrap(true);
lbl->setAlignment(Qt::AlignCenter);
layout->addWidget(lbl, 1, 0, Qt::AlignTop);
widget->setMaximumWidth(80);
widget->setMinimumWidth(80);
return widget;
}
然后我创建一个 QGridLayout
并用这些控件填充它:
QWidget *itemWidget_FlowControl = new QWidget(this);
QGridLayout *_flowControl_layout = new QGridLayout(itemWidget_FlowControl);
_flowControl_layout->addWidget(createCellWidget(), 0, 0);
这很好用并产生了这个输出:
这个布局不错。不幸的是,如果我放大 window,控件不会 "flow",所以我尝试用流式布局 (here are the source files) 替换 QGridLayout。
现在行为好多了。但是...
这就是我得到的。较长的字幕布局如同 single-lined,因此文本与按钮重叠。
我该怎么做才能让它看起来像以前的样子,但又保持 "flow layout" 的样子?或者您知道 QT 5.2 中是否有任何替代方案?
谢谢
怎么了?
您在使用流式布局方面走在正确的轨道上。
唯一的问题是单元格小部件的内部布局(QGridLayout
在您的情况下)也会响应调整大小事件而拉伸。
解决方案
解决方案非常简单:
Try to limit the stretch of the internal layout.
工厂函数内 QWidget *createCellWidget()
:
[选项 1]
添加lbl->setMaximumWidth(60);
以手动限制标签宽度的拉伸。这使得内部布局不那么“自由”地伸展。
[选项 2]
添加layout->setSizeConstraint(QLayout::SetFixedSize);
以抑制内部布局拉伸。通过这样做,您可能需要手动添加一些换行代码 (\n
) 到您的“超长标题”,以防 Qt 自动确定的标签宽度不适合您的需要。
结果
IMO 最好的方法是使用关闭样式 sheets(流式布局可以)。
只需使用 QButton
,但通过改变麦粒肿来自定义其视图 sheet。
目前没时间写例子