布局类(08):【类】QGridLayout[官翻]

QGridLayout 类

QGridLayout类在网格中布局小部件。

Header:#include < QGridLayout >
qmake:QT += widgets
Inherits:QLayout
Inherited By:

详细说明

QGridLayout获取可用的空间(通过其父布局或parentWidget() ),将其划分为行和列,并将它管理的每个小部件放入正确的单元格中。

列和行的行为是相同的;我们将讨论列,但行具有等价的函数。

每列都有一个最小宽度和一个拉伸因子。最小宽度是使用setColumnMinimumWidth() 设置的最大宽度,也是该列中每个小部件的最小宽度。拉伸因子是使用setColumnStretch() 设置的,它决定了该列将获得多少超出其所需最小值的可用空间。

通常,使用addWidget() 将每个托管小部件或布局放入自己的单元格中。小部件还可以使用addItem() 和addWidget() 的跨行和跨列重载来占用多个单元格。如果这样做,QGridLayout将猜测如何在列/行上分布大小(基于拉伸因子)。

要从布局中删除小部件,请调用removeWidget() 。在小部件上调用QWidget::hide() 也可以有效地将小部件从布局中移除,直到调用QWidget::show() 为止。

此图显示了一个具有五列三行网格的对话框片段(网格以洋红色覆盖显示):A grid layout

此对话框片段中的第0、2和4列由QLabel、QLineEdit和QListBox组成。列1和3是用setColumnMinimumWidth() 生成的占位符。行0由三个QLabel对象组成,行1由三个QLineEdit对象组成,行2由三个QListBox对象组成。我们使用占位符列(1和3)在列之间获得适当的空间量。

请注意,列和行的宽度和高度不同。如果希望两列具有相同的宽度,则必须将它们的最小宽度拉伸系数设置为相同。您可以使用setColumnMinimumWidth() 和setColumnStretch() 执行此操作。

如果QGridLayout不是顶级布局(即,不管理小部件的所有区域和子级),则必须在创建它时将其添加到其父布局中,但在对其执行任何操作之前。添加布局的常规方法是对父布局调用addLayout() 。

添加布局后,可以使用addWidget() 、addItem() 和addLayout() 将小部件和其他布局放入网格布局的单元格中。

QGridLayout还包括两种边距宽度:内容边距和间距() 。内容边距是QGridLayout的四条边上保留空间的宽度。spacing() 是相邻框之间自动分配的间距的宽度。

默认内容边距值由样式提供。Qt styles指定的默认值对于子窗口小部件是9,对于windows是11。间距默认与顶层布局的边距宽度相同,或与父布局相同。

属性

  1. horizontalSpacing: int 并排排列的小部件之间的间距
    如果没有显式设置值,则布局的水平间距将从父布局继承,或从父小部件的样式设置继承。

    • int horizontalSpacing() const
    • void setHorizontalSpacing(int spacing)

  2. verticalSpacing: int 小部件之间的间距

    如果没有显式设置值,则布局的间距将从父布局继承,或从父小部件的样式设置继承。
    对于QGridLayout和QFormLayout,可以使用setHorizontalSpacing() 和setVerticalSpacing() 设置不同的水平和垂直间距。在这种情况下,spacing() 返回-1。

    • int verticalSpacing() const
    • void setVerticalSpacing(int spacing)

公共函数

构造和析构

  • QGridLayout()
  • QGridLayout(QWidget *parent)
  • virtual ~QGridLayout()

属性相关

  • int horizontalSpacing() const
  • void setHorizontalSpacing(int spacing)
  • int verticalSpacing() const
  • void setVerticalSpacing(int spacing)

增加和索引

  • void addItem(QLayoutItem *item, int row, int column, int rowSpan = 1, int columnSpan = 1, Qt::Alignment alignment = Qt::Alignment())
  • void addLayout(QLayout *layout, int row, int column, Qt::Alignment alignment = Qt::Alignment())
  • void addLayout(QLayout *layout, int row, int column, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment())
  • void addWidget(QWidget *widget, int row, int column, Qt::Alignment alignment = Qt::Alignment())
  • void addWidget(QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment())
  • int rowCount() const
  • int columnCount() const

位置相关

  • Qt::Corner originCorner() const
  • void setOriginCorner(Qt::Corner corner)
  • void getItemPosition(int index, int *row, int *column, int *rowSpan, int *columnSpan) const
  • QLayoutItem * itemAtPosition(int row, int column) const

大小相关

  • QRect cellRect(int row, int column) const
  • int spacing() const
    void setSpacing(int spacing)
  • int rowMinimumHeight(int row) const
    void setRowMinimumHeight(int row, int minSize)
  • int columnMinimumWidth(int column) const
    void setColumnMinimumWidth(int column, int minSize)
  • int rowStretch(int row) const
    void setRowStretch(int row, int stretch)
  • int columnStretch(int column) const
    void setColumnStretch(int column, int stretch)

重写的公共函数

  • virtual int count() const override
  • virtual QLayoutItem * itemAt(int index) const override
    virtual QLayoutItem * takeAt(int index) override
  • virtual Qt::Orientations expandingDirections() const override
  • virtual bool hasHeightForWidth() const override
    virtual int heightForWidth(int w) const override
  • virtual void invalidate() override
  • virtual QSize minimumSize() const override
    virtual QSize maximumSize() const override
  • virtual int minimumHeightForWidth(int w) const override
  • virtual void setGeometry(const QRect &rect) override
  • virtual QSize sizeHint() const override

重写的受保护的函数

  • virtual void addItem(QLayoutItem *item) override

相关代码

#include <QtWidgets>
#define Layout QGridLayout
int i,j,count;
QList <QLabel *> labels;
QList <Layout *> layouts;

void addFrame(QWidget *parent){
    QGridLayout  *mainLayout =static_cast<QGridLayout *>(parent->layout () ) ;

    QFrame *frame = new QFrame();
    frame->setFrameStyle (QFrame::Panel | QFrame::Plain);
    QVBoxLayout *vBox = new QVBoxLayout(frame);

    QLabel *label = new QLabel();
    label->setMaximumHeight (30);
    labels << label;
    vBox->addWidget (label);

    Layout *layout = new Layout;
    layouts << layout;
    vBox->addLayout (layout);

    for (int var = 0; var < 9; ++var) {
        auto *widget = new QPushButton(QString::number (var));
        widget->setStyleSheet ("background:yellow");
        layout->addWidget (widget,var/3,var%3);
    }

    mainLayout->addWidget (frame,i,j);

    ++j,++count;
}

Layout* getLayout(int i){
    if(i > count ){
        qDebug() << i << __LINE__;
        return 0;
    }
    return layouts.at (i);
}

void setLable(int i, QString text){
    if(i > count ){
        qDebug() <<"getLayout"<<  i << __LINE__;
        return;
    }
    labels.at (i)->setText (text);
}

int main(int argc, char *argv[])
{
    QApplication::setStyle (QStyleFactory::create ("fusion"));

    QApplication app(argc, argv);
    QMetaObject mo = Layout::staticMetaObject;
    app.setApplicationName (mo.className ());

    QDialog dialog;
    dialog.setWindowFlag (Qt::WindowContextHelpButtonHint,false);

    auto *mainLayout = new QGridLayout;
    dialog.setLayout (mainLayout);

    addFrame(&dialog);
    addFrame(&dialog);

    getLayout (0)->setVerticalSpacing (0);
    getLayout (1)->setVerticalSpacing (20);

    setLable (0, "setVerticalSpacing (0)");
    setLable (1, "setVerticalSpacing (20)");

    dialog.resize (400,200);
    dialog.show();
    return app.exec();
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值