【问题标题】:Stretching a QLabel in a QGridLayout在 QGridLayout 中拉伸 QLabel
【发布时间】:2017-02-15 01:29:47
【问题描述】:

我正在手动创建一组 QLabel,它们被放入 QGridLayout 中,并且应该均匀分布。当我使用 QT Designer 创建一个测试表单并添加一系列标签并将它们放在 QGridLayout 中时,标签会占据网格中单元格的全部大小。当我在 C++ 中手动执行此操作时,标签不会扩展并显示文本的最小大小。我可以让这些标签垂直扩展,但不能水平扩展。

这是我创建 QGridLayout 的方式:

m_layout = new QGridLayout;
m_layout->setHorizontalSpacing( 1 );
m_layout->setVerticalSpacing( 1 );
m_layout->setContentsMargins(0,0,0,0);
m_layout->setMargin(0);
m_layout->setSizeConstraint( QGridLayout::SetDefaultConstraint );
//m_layout->setSizeConstraint( QGridLayout::SetMaximumSize );

当我更改大小约束时,它根本不会影响标签的大小,所以我认为问题可能在于我如何创建标签,情况如下:

QLabel *label = new QLabel;
label->setAlignment( Qt::AlignCenter );
label->setFrameStyle( QFrame::Raised );
label->setMinimumSize( QSize(0,0) );
label->setMaximumSize( QSize(16777215, 16777215) );
label->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred );

现在,所有 QLabel 的大小都相同,但最终它们的大小会有所不同,这就是我使用打包箱算法的原因。我围绕这样的类设计了算法:

struct ButtonFittingNode
{
    ButtonFittingNode( QRect rectangle, QGridLayout *layout )
        : used( false )
        , node( rectangle )
        , down( NULL )
        , right( NULL )
        , m_layout( layout )
    { }

    ~ButtonFittingNode()
    {
        if ( down ) delete down;
        if ( right ) delete right;
    }

    ButtonFittingNode *findNode( QLabel *btn )
    {
        int w = 1;
        int h = 1;
        if ( this->used )
        {
            ButtonFittingNode *bfn = NULL;
            if ( this->right ) bfn = this->right->findNode( btn );
            if ( this->down && !bfn ) bfn = this->down->findNode( btn );
            return bfn;
        }
        else if ( ( w <= node.width() ) && ( h <= node.height() ) )
        {
            qDebug() << "Placing at " << node.x() << node.y();
            m_layout->addWidget( btn, node.y(), node.x(), w, h, Qt::AlignJustify );
            this->used = true;
            this->splitNode( QSize( w, h ) );
            return this;
        }

        return NULL;
    }

    void splitNode( QSize sz )
    {
        int w = 0, h = 0;

        // Create a down node
        w = this->node.width();
        h = this->node.height() - sz.height();
        if ( h > 0 )
        {
            QRect n( this->node.x(), this->node.y() + sz.height(), w, h );
            this->down = new ButtonFittingNode( n, m_layout );
        }

        // Create a right node
        w = this->node.size().width() - sz.width();
        h = sz.height();
        if ( w > 0 )
        {
            QRect n( this->node.x() + sz.width(), this->node.y(), w, h );
            this->right = new ButtonFittingNode( n, m_layout );
        }
    }

    bool                used;
    QRect               node;
    ButtonFittingNode   *down;
    ButtonFittingNode   *right;
private:
    QGridLayout         *m_layout;
};

使用 3x2 网格,我得到以下输出:

对不起,我不得不模糊文本,因为这是一个与工作相关的项目,但灰色是背景,白色是标签的背景。如您所见,他们很高,但很瘦。我希望这些标签又高又胖。我是否设置了一些错误的属性?

【问题讨论】:

    标签: c++ qt grid-layout


    【解决方案1】:

    这一切真的很简单。布局的大小限制与您所看到的内容没有任何关系。您还包括一堆无用的样板代码。除非您考虑到一些非默认尺寸,否则请摆脱最小和最大尺寸的显式设置。这是完全没用的:

    label->setMinimumSize( QSize(0,0) );
    label->setMaximumSize( QSize(16777215, 16777215) );
    

    您需要将标签的sizePolicy设置为水平方向的Expanding。这就是它的全部内容:

    label->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred );
    

    我知道您想要从您的装箱系统中得到什么,但它不会按原样很好地工作,因为网格中的列/行大小会随着网格大小的调整而变化。您的打包程序将根据当前行/列大小选择一些列/行跨度。调整大小后,打包机的决定将不再适用。

    您真正想要的是一个自定义布局,可以即时完成所有打包工作。 flow layout example 可能与您想要的非常接近。

    【讨论】:

    • 嗯,使用 bin 打包机,我实际上决定了大小,它按预期工作。将水平尺寸策略设置为 QSizePolicy::Expanding 没有按照您的建议工作,但现在我已经测试了更多,如果在将小部件添加到布局时不设置任何对齐数据,它确实有效。我输入了所有无用的样板代码来尝试确定为什么我的标签没有按预期运行。此外,在我的测试设计器表单中,标签上的尺寸策略是 QSizePolicy::Preferred 水平和垂直,它按预期工作。
    • 就是这么说,感谢您的帮助,但我仍然很困惑为什么网格中的对齐会导致大小受到干扰。
    • @OzBarry:可能是因为这是网格布局的行为。这可能是错误或功能。
    猜你喜欢
    • 2021-12-21
    • 2018-08-02
    • 2012-06-10
    • 1970-01-01
    • 2013-04-29
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    相关资源
    最近更新 更多