QGridLayout示例及刷新布局

 

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;

并重新我布局分配空间,为了之后的布局做准备。

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值