这是一个纯代码布局练习,没有对应功能的实现。
显示效果
话不多说,直接上代码
main.cpp
主函数没有作任何改变
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
widget.h
主要用到一些控件QWidget,QLineEdit,QLabel,QPushButton,声明了layout()函数,三个指针数组来存放多个控件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QLineEdit>
#include <QLabel>
#include <QPushButton>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
void layout();
private:
Ui::Widget *ui;
//定义三个指针数组
QLineEdit *lineEdit[3];
QLabel *label[2];
QPushButton *buttons[16];
};
#endif // WIDGET_H
widget.cpp
三种布局方式,垂直布局,水平布局和网格布局
#include "widget.h"
#include "ui_widget.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
layout();
}
void Widget::layout(){
QString types = "+=";
QString ch = "123*456+789-0./=";
//QWidget *w = new Widget;
QVBoxLayout *vbox =new QVBoxLayout(this);
QHBoxLayout *hbox =new QHBoxLayout();
for(int i = 0;i<3;i++){
lineEdit[i] = new QLineEdit;
}
for(int i = 0;i<2;i++){
label[i] = new QLabel;
label[i]->setText(types.at(i));
}
hbox->addWidget(lineEdit[0]);
hbox->addWidget(label[0]);
hbox->addWidget(lineEdit[1]);
hbox->addWidget(label[1]);
hbox->addWidget(lineEdit[2]);
vbox->addLayout(hbox);
QGridLayout *grid = new QGridLayout;
QSizePolicy sizepolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
for(int i = 0;i<4;i++){
for(int j = 0;j<4;j++){
buttons[i*4+j] = new QPushButton;
grid->addWidget(buttons[i*4+j],i,j,1,1);
buttons[i*4+j]->setText(ch.at(i*4+j));
buttons[i*4+j]->setSizePolicy(sizepolicy);
}
}
vbox->addLayout(grid);
}
Widget::~Widget()
{
delete ui;
}
注意:设置了网格中元素的布局sizepolicy之前长这样
QSizePolicy sizepolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
buttons[i*4+j]->setSizePolicy(sizepolicy);
也就是这两句的作用
完美~