Qt之格栅布局(QGridLayout):https://blog.csdn.net/swartz_lubel/article/details/54932517
Qt学习之路14--布局管理器(QGridLayout):https://blog.csdn.net/tqs_1220/article/details/81842878
具体的接口用法细节,上述文章中均有提及,下面举一个实际开发过程中的例子:
Qt 之 QSizePolicy:https://blog.csdn.net/liang19890820/article/details/51986284
QSpacerItem (Horizontal Spacer 、Vertical Spacer) 的隐藏与显示:https://blog.csdn.net/xiezhongyuan07/article/details/81111829
效果:
.cpp:
#include "widget.h"
#include "ui_widget.h"
using namespace QtCharts;
Widget::Widget(QWidget *parent) :
QWidget(parent)
// ui(new Ui::Widget)
{
// ui->setupUi(this);
setui();
}
Widget::~Widget()
{
// delete ui;
}
void Widget::setui()
{
//需要布局的元器件(五个摁键,一个QLable,一个QTextEdit,一个ComboBox,一个TableWidget,一个QChart)
QPushButton * One = new QPushButton("One",this);
QPushButton * Two = new QPushButton("Two",this);
QPushButton * Three = new QPushButton("Three",this);
QPushButton * Four = new QPushButton("Four",this);
QPushButton * Five = new QPushButton("Five",this);
//最小尺寸设置
One->setMinimumSize(100,40);
Two->setMinimumSize(100,40);
Three->setMinimumSize(100,40);
Four->setMinimumSize(100,40);
Five->setMinimumSize(100,40);
QLabel * Label_One = new QLabel("QGridLayout测试",this);
Label_One->setMinimumSize(60,20);
QTextEdit * TextEdit_One = new QTextEdit(this);
TextEdit_One->setText("20191019");
TextEdit_One->setMaximumSize(100,40);
QComboBox * combobox = new QComboBox(this);
combobox->addItem("选项1");
combobox->setMinimumSize(100,40);
QTableWidget * Table_one = new QTableWidget(this);
Table_one->setWindowTitle("Test");
Table_one->setMinimumSize(300,400);
Table_one->setRowCount(10);
Table_one->setColumnCount(4);
//固定行列高宽
// for(int i = 0;i<10;++i)
// {
// Table_one->setRowHeight(i,40);
// }
// for(int i = 0;i<4;++i)
// {
// Table_one->setColumnWidth(i,65);
// }
Table_one->horizontalHeader()->setSectionResizeMode(QHeaderView.Stretch);
Table_one->verticalHeader()->setSectionResizeMode(QHeaderView.Stretch);
//只读模式,设置点击(Triggers)的编辑模式
Table_one->setEditTriggers(QAbstractItemView::NoEditTriggers);
QStringList headr;
headr<<"O"<<"T"<<"TT"<<"F";
Table_one->setVerticalHeaderLabels(headr);
QStringList Vheadr;
Vheadr<<"1"<<"2"<<"3"<<"4"<<"5"<<"6"<<"7"<<"8"<<"9"<<"10";
Table_one->setHorizontalHeaderLabels(Vheadr);
QChart *chart = new QChart;
//添加曲线数据
QList<QPointF>list;
QLineSeries *serial;
serial = new QLineSeries(this);//必须要new, 才能实现更新
list<<QPointF(0,0)<<QPointF(0,40);//x,y
serial->setName("Line 1");
serial->append(list);//在serial中添加数据
//Chart相关
chart->addSeries(serial);//将数据加载到QChart
chart->createDefaultAxes();//根据数据集,自动创建坐标轴,坐标轴的区间恰好完全容纳已有的数据集
chart->setTitle("测试");//图像的题目
chart->setAnimationOptions(QChart::SeriesAnimations);//以动画的形式显示
chart->legend()->setVisible(true);//图例是否显示
chart->legend()->setAlignment(Qt::AlignBottom);//(图例的位置)
QChartView *view=new QChartView(chart);//准备将chart进行显示
//这个应该不用说的,消除锯齿
view->setRenderHint(QPainter::Antialiasing);
view->setMinimumSize(500,500);
//字体大小及样式设置
QFont FontForTest;
FontForTest.setFamily("Microsoft YaHei");//字体设置
FontForTest.setPixelSize(16);//字号
FontForTest.setBold(false);//是否加粗
One->setFont(FontForTest);
Two->setFont(FontForTest);
Three->setFont(FontForTest);
Four->setFont(FontForTest);
Five->setFont(FontForTest);
Label_One->setFont(FontForTest);
combobox->setFont(FontForTest);
QGridLayout * GridLayout = new QGridLayout(this);
GridLayout->addWidget(One,0,0,1,1,Qt::AlignLeft|Qt::AlignVCenter);
GridLayout->addWidget(Two,0,1,1,1,Qt::AlignRight|Qt::AlignVCenter);
GridLayout->addWidget(Three,0,2,1,1,Qt::AlignCenter);
GridLayout->addWidget(combobox,0,3,1,1,Qt::AlignCenter);
GridLayout->addWidget(Table_one,1,0,1,2,Qt::AlignCenter);
GridLayout->addWidget(view,1,2,1,2,Qt::AlignCenter);
GridLayout->addWidget(Label_One,2,0,1,1,Qt::AlignCenter);
GridLayout->addWidget(TextEdit_One,2,1,1,1,Qt::AlignCenter);
GridLayout->addWidget(Four,2,2,1,1,Qt::AlignLeft|Qt::AlignVCenter);
GridLayout->addWidget(Five,2,3,1,1,Qt::AlignRight|Qt::AlignVCenter);
// 设置水平间距
GridLayout->setHorizontalSpacing(10);
// 设置垂直间距
GridLayout->setVerticalSpacing(5);
GridLayout->setContentsMargins(10, 10, 10, 10);
//行拉伸
GridLayout->setRowStretch(0, 1);//拉伸因子
GridLayout->setRowStretch(1, 4);//拉伸因子
GridLayout->setRowStretch(2, 1);//拉伸因子
//列拉伸
GridLayout->setColumnStretch(0, 1);//拉伸因子
GridLayout->setColumnStretch(1, 1);//拉伸因子
GridLayout->setColumnStretch(2, 2);//拉伸因子
GridLayout->setColumnStretch(3, 2);//拉伸因子
}
关于刷新布局:
同一个Dialog中,根据用户的选择,会弹出两种界面。
//Dialog.h
private:
QGridLayout *GridLayout;
//Dialog.cpp
QDialog::QDialog(QWidget *parent) :
QDialog(parent)
{
............
GridLayout = new QGridLayout(this);
...........
}
void coeffclass::WindowForChose()
{
QMessageBox box(QMessageBox::Warning, "选择","请选择模式:");
box.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
box.setButtonText(QMessageBox::Yes, QString("模式1"));
box.setButtonText(QMessageBox::No, QString("模式2"));
int ret = box.exec();
if(ret == QMessageBox::Yes)
{
//选择一个阶数就行
UISET_WindowForChose(true);
}
else if(ret == QMessageBox::No)
{
//选择多组阶数
UISET_WindowForChose(false);
}
}
void coeffclass::UISET_WindowForChose(const bool MODE)
{
qDebug()<<"进入UI设置";
Chosemode = MODE;
if(MODE == true)
{
//清空当前页面布局
qDebug()<<GridLayout->count();
if(GridLayout->count()!=0)
{
QLayoutItem *child;
while ((child = GridLayout->takeAt(0)) != 0)
{
GridLayout->removeWidget(child->widget());
child->widget()->setParent(0);
delete child;
}
delete GridLayout;
GridLayout = new QGridLayout(this);
}
//栅格化布局的相关设置
........
//栅格化布局的相关设置
setLayout(GridLayout);
this->show();
}
else if(MODE == false)
{
qDebug()<<GridLayout->count();
if(GridLayout->count()!=0)
{
QLayoutItem *child;
while ((child = GridLayout->takeAt(0)) != 0)
{
GridLayout->removeWidget(child->widget());
child->widget()->setParent(0);
delete child;
}
delete GridLayout;
GridLayout = new QGridLayout(this);
}
//栅格化布局的相关设置
........
//栅格化布局的相关设置
setLayout(GridLayout);
this->show();
}
}
首先:判断进行新布局前,有没有旧布局需要清理,如果没有,进行新布局,如果有,删除旧布局。
关于删除旧布局:
if(GridLayout->count()!=0)
{
QLayoutItem *child;
while ((child = GridLayout->takeAt(0)) != 0)
{
GridLayout->removeWidget(child->widget());
child->widget()->setParent(0);
delete child;
}
delete GridLayout;
GridLayout = new QGridLayout(this);
}
①:QGridLayout需要移除该控件 GridLayout->removeWidget(child->widget());
②:将该控件的父对象设置为0 child->widget()->setParent(0);
③:删除该控件 delete child;
④:最终删除整个布局 delete GridLayout;
并重新我布局分配空间,为了之后的布局做准备。