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() 为止。
此图显示了一个具有五列三行网格的对话框片段(网格以洋红色覆盖显示):
此对话框片段中的第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。间距默认与顶层布局的边距宽度相同,或与父布局相同。
属性
-
horizontalSpacing: int 并排排列的小部件之间的间距
如果没有显式设置值,则布局的水平间距将从父布局继承,或从父小部件的样式设置继承。- int horizontalSpacing() const
- void setHorizontalSpacing(int spacing)
-
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();
}