QT Flowlayout - 多行标签问题

fra*_*i87 2 qt flowlayout

我在 QT 布局方面遇到了一个小问题。

我有一个工具箱,我想用一些带有描述的可检查按钮填充它。所以我用QWidgeta创建一个QGridLayout并将 放在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;
}
Run Code Online (Sandbox Code Playgroud)

然后我创建一个QGridLayout并用这些控件填充它:

QWidget *itemWidget_FlowControl = new QWidget(this);
QGridLayout *_flowControl_layout = new QGridLayout(itemWidget_FlowControl);
_flowControl_layout->addWidget(createCellWidget(), 0, 0);
Run Code Online (Sandbox Code Playgroud)

这运行良好并产生以下输出:

小部件正确对齐

这是一个不错的布局。不幸的是,如果我放大窗口,控件不会“流动”,所以我尝试用 flowlayout 替换 QGridLayout (这里是源文件)。

现在行为好多了。但...

小部件未对齐

这就是我得到的。较长的标题的布局就像单行一样,因此文本与按钮重叠。

我能做些什么来让它看起来像以前一样,但保持它作为“流布局”?或者你知道QT 5.2是否有替代方案?

谢谢

Tay*_*510 5

怎么了?

您使用 Flowlayout 的方向是正确的。

唯一的问题是单元格小部件的内部布局QGridLayout在您的情况下)也会响应调整大小事件而拉伸。


解决方案

解决方案出奇的简单:

尽量限制内部布局的伸展。

工厂内功能QWidget *createCellWidget()

[选项1]

添加lbl->setMaximumWidth(60);手动限制标签宽度的拉伸。这使得内部布局不能那么“自由”地伸展。

[选项2]

添加layout->setSizeConstraint(QLayout::SetFixedSize);以抑制内部布局拉伸。通过这样做,您可能需要手动添加一些换行代码 ( \n) 到您的“非常长的标题”,以防 Qt 自动决定的标签宽度不适合您的需要。


结果

在此输入图像描述