QT Flowlayout - 多行标签问题

时间:2015-03-24 15:53:20

标签: qt flowlayout

QT布局有一个小问题。

我有一个工具箱,我想用一些带有描述的可检查按钮填充它。因此,我使用QWidget创建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;
}

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

QWidget *itemWidget_FlowControl = new QWidget(this);
QGridLayout *_flowControl_layout = new QGridLayout(itemWidget_FlowControl);
_flowControl_layout->addWidget(createCellWidget(), 0, 0);

这很好用并产生这个输出:

Widgets properly aligned

这是一个很好的布局。不幸的是,如果我放大窗口控件不会“流动”,所以我尝试用flowlayout(here are the source files)替换QGridLayout。

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

Widgets not alignet

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

我能做些什么让它看起来像以前一样,但保持它作为“流程布局”?或者你知道QT 5.2中是否还有其他选择?

谢谢

2 个答案:

答案 0 :(得分:4)

怎么了?

您正在使用flowlayout。

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


解决方案

解决方案非常简单:

  

尝试限制内部布局的延伸

在工厂函数QWidget *createCellWidget()中:

[选项1]

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

[选项2]

添加layout->setSizeConstraint(QLayout::SetFixedSize);以限制内部布局拉伸。通过执行此操作,您可能需要手动将一些换行符代码(\n)添加到“非常长的标题”中,以防Qt自动确定的标签宽度不符合您的需要。


结果

enter image description here

答案 1 :(得分:0)

IMO最好的方法是使用样式表(流程布局好)。 只需使用QButton,但可以通过更改其stye表来自定义其视图 目前我没时间写一个例子。