QVBoxLayout不是一个Widget,目的是控件的大小和位置。
sizeHint()推荐尺寸,重载进行修改尺寸,返回Qsiye。或者通过函数setMinimumSize和setMaximumSize进行设置最大最小值。
QSizePolicy::PolicyFlag
GrowFlag
ExpandFlag
ShrinkFlag
IgnoreFlag
拼接之后有:
四种Layout
ui_myqt1.h
/********************************************************************************
** Form generated from reading UI file 'myqt1.ui'
**
** Created by: Qt User Interface Compiler version 5.14.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
#ifndef UI_MYQT1_H
#define UI_MYQT1_H
#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
class Ui_myqt1Class
{
public:
QWidget *verticalLayoutWidget;
QVBoxLayout *verticalLayout;
QPushButton *pushButton_2;
QPushButton *pushButton;
QPushButton *pushButton_3;
void setupUi(QWidget *myqt1Class)
{
if (myqt1Class->objectName().isEmpty())
myqt1Class->setObjectName(QString::fromUtf8("myqt1Class"));
myqt1Class->resize(836, 517);
verticalLayoutWidget = new QWidget(myqt1Class);
verticalLayoutWidget->setObjectName(QString::fromUtf8("verticalLayoutWidget"));
verticalLayoutWidget->setGeometry(QRect(20, 20, 191, 141));
verticalLayout = new QVBoxLayout(verticalLayoutWidget);
verticalLayout->setSpacing(6);
verticalLayout->setContentsMargins(11, 11, 11, 11);
verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
verticalLayout->setContentsMargins(0, 0, 0, 0);
pushButton_2 = new QPushButton(verticalLayoutWidget);
pushButton_2->setObjectName(QString::fromUtf8("pushButton_2"));
verticalLayout->addWidget(pushButton_2);
pushButton = new QPushButton(verticalLayoutWidget);
pushButton->setObjectName(QString::fromUtf8("pushButton"));
verticalLayout->addWidget(pushButton);
pushButton_3 = new QPushButton(verticalLayoutWidget);
pushButton_3->setObjectName(QString::fromUtf8("pushButton_3"));
verticalLayout->addWidget(pushButton_3);
retranslateUi(myqt1Class);
QMetaObject::connectSlotsByName(myqt1Class);
} // setupUi
void retranslateUi(QWidget *myqt1Class)
{
myqt1Class->setWindowTitle(QCoreApplication::translate("myqt1Class", "myqt1", nullptr));
pushButton_2->setText(QCoreApplication::translate("myqt1Class", "PushButton", nullptr));
pushButton->setText(QCoreApplication::translate("myqt1Class", "PushButton", nullptr));
pushButton_3->setText(QCoreApplication::translate("myqt1Class", "PushButton", nullptr));
} // retranslateUi
};
namespace Ui {
class myqt1Class: public Ui_myqt1Class {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_MYQT1_H
控件设置,垂直和水平布局
//#include "myqt2.h"
#include <QtWidgets/QApplication>
#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
/*myqt2 w;
w.show();*/
QWidget* win = new QWidget();
win->resize(400, 400);
//垂直布局,构造函数传递widget
//QVBoxLayout* lay = new QVBoxLayout();
//垂直布局
QHBoxLayout* lay = new QHBoxLayout();
win->setLayout(lay);
QPushButton* but1 = new QPushButton("button1");
lay->addWidget(but1);
//水平 垂直 fixed使用推荐大小
but1->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
//尽量拉伸,最小是推荐值
but1->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
//尽量拉伸,没有最小值限制
but1->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
//设置控件的最小值
but1->setMinimumSize(100,50);
//设置空间最大值
but1->setMaximumSize(500,100);
QPushButton* but2 = new QPushButton("button2");
lay->addWidget(but2);
QPushButton* but3 = new QPushButton("button3");
lay->addWidget(but3);
lay->setContentsMargins(0,0,0,0); //设置边缘距离
lay->setSpacing(5); //设置控件间距
win->show();
qDebug() << but1->sizeHint().width() << ";" << but1->sizeHint().height(); //显示推荐值大小
qDebug() << but1->width() << ";" << but1->height(); //显示实际的大小
return a.exec();
}
表格布局
#include "myqt3.h"
#include <QtWidgets/QApplication>
#include <QGridLayout>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
/*myqt3 w;
w.show();*/
QWidget* win = new QWidget();
win->resize(300,300);
QGridLayout* g1 = new QGridLayout(win);
QPushButton* but11 = new QPushButton("but11");
g1->addWidget(but11,0,0);
QPushButton* but12 = new QPushButton("but12");
but12->setMinimumSize(100, 100);
but12->setMaximumSize(500, 500);
but12->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
g1->addWidget(but12,0,1);
QPushButton* but13 = new QPushButton("but13");
g1->addWidget(but13,0,2);
QPushButton* but21 = new QPushButton("but21");
g1->addWidget(but21,1,0);
QPushButton* but22 = new QPushButton("but22");
g1->addWidget(but22, 1, 1);
QPushButton* but23 = new QPushButton("but23");
g1->addWidget(but23, 1, 2);
win->show();
return a.exec();
}
表单布局
#include "myqt3.h"
#include <QFormLayout>
#include <QPushButton>
#include <QlineEdit>
#include <QLabel>
myqt3::myqt3(QWidget* parent)
: QWidget(parent)
{
ui.setupUi(this);
QFormLayout* lay = new QFormLayout(this);
QLineEdit* name = new QLineEdit();
lay->addRow("&Name", name);
QLineEdit* email = new QLineEdit();
lay->addRow("&Email", email);
QLineEdit* age = new QLineEdit();
//添加age到第一个位置
lay->insertRow(1, "&Age", age);
QLabel* info = new QLabel();
info->setText("input");
//设置样式表
info->setStyleSheet("color:red;");
lay->insertRow(0, "", info);
//添加Save 和Clear按钮
QPushButton* save = new QPushButton("Save");
QPushButton* clear = new QPushButton("Clear");
//添加一个平行布局
QHBoxLayout* hlay = new QHBoxLayout();
hlay->addWidget(save);
hlay->addWidget(clear);
lay->addRow(hlay);
QObject::connect(save, SIGNAL(clicked()), this, SLOT(Save()));
QObject::connect(clear, SIGNAL(clicked()), this, SLOT(Clear()));
}
void myqt3::Save()
{
//找到layout
QFormLayout* lay = (QFormLayout*)this->layout(); //强制转换layout为QFormLayout
QLabel* label = (QLabel*)lay->itemAt(0, QFormLayout::FieldRole)->widget();
//存放错误信息
QString error = "";
//遍历所有QLineEdit
//遍历所有FormLayout的所有元素
for (int i = 0; i < lay->rowCount(); i++)
{
QLayoutItem* item = lay->itemAt(i, QFormLayout::FieldRole); //获取输入框,可能是QLineEidt,也可能是按键
QLineEdit* e = (QLineEdit*)item->widget(); //将所有widget转化为QLineEidt
if (!e) //转换成功非空,否则转换成功
continue;
QLayoutItem* layItem = lay->itemAt(i, QFormLayout::LabelRole);
if (!layItem) continue;
QLabel* titleLabel = (QLabel*)layItem->widget();
if (!titleLabel) continue;
QString title = titleLabel->text();
//如果转换成功
QString cname = e->metaObject()->className(); //获取输入框的名字
if (cname == "QLineEdit")
{
if (e->text().trimmed() == "")
{
e->setFocus(); //设置光标,移动到此
error += title;
error += " is empty!\n";
}
}
}
label->setText(error);
}
void myqt3::Clear()
{
//找到layout
QFormLayout *lay = (QFormLayout *)this->layout(); //强制转换layout为QFormLayout
//遍历所有QLineEdit
//遍历所有FormLayout的所有元素
for (int i = 0; i < lay->rowCount(); i++)
{
QLayoutItem* item = lay->itemAt(i, QFormLayout::FieldRole); //获取输入框,可能是QLineEidt,也可能是按键
QLineEdit* e = (QLineEdit*)item->widget(); //将所有widget转化为QLineEidt
if (!e) //转换成功非空,否则转换成功
continue;
//如果转换成功
QString cname = e->metaObject()->className(); //获取输入框的名字
if (cname == "QLineEdit")
{
e->setText(""); //清空输入框
}
}
}