7.6 QT学习小结(二)

本文详细介绍了使用QT进行布局相关操作的经验总结,包括QTabWidget的应用与自定义类SignalPillar的布局实现。从QTabWidget的使用到布局(HLayout, VLayout, GridLayout)的基本概念和实例,提供了深入的代码解析与实践指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.chinaunix.net/uid-27717694-id-3792421.html

QT学习小结(二)


学习使用QT有段时间了,初步先做下小结,留作备忘。


目录


PART II  (布局相关)
7. QTabWidget的应用
8. 布局(Layout)


PART II
==========================================================================
7. QTabWidget的应用
QTabWidget是一个很好用的控件,依据某种条件(或许是个人的喜好)后,它可以将很多内容聚集在一个很小的空间里。这样既可以节省屏幕空间,又可以很清晰地规划出各项内容,不会在信息量过多时导致屏幕显示混乱。
对于QMainWindow,QTabWidget作用于centralWidget中,即QWidget。


示例
a. 创建如下的TabWidget




b. 代码


//变量定义
    QWidget *centralwidget;
    //tab widget below:
    QTabWidget *twSerial; //tab widget below, for serial
    QWidget *tabRcv; // serial data receive widget
    QTextBrowser *tbRcv; // text browser for received data
    QWidget *tabSend; // serial data send widget
    QTextBrowser *tbSend; // text browser for send data
    QWidget *tabSignal; //widget signal power
    SignalPillar *m_pillar; //请注意:SignalPillar是自己编写的继承于QGroupBox的类,非QT类


// centralwidget定义
        centralwidget = new QWidget(WndTest); // WndTest是QMainWindow的实例
        centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
        WndTest->setCentralWidget(centralwidget);


//QTabWidget实现
        ////////////////////////////////////////////////////////////////////////////////////////
        //tab widget below:
        ////////////////////////////////////////////////////////////////////////////////////////
        twSerial = new QTabWidget(centralwidget); //此处的centralwidget必不可少,根据实际情况可替换成QWidget实例
        twSerial->setObjectName(QString::fromUtf8("twSerial")); // set object name
        twSerial->setGeometry(QRect(1, 310, 298, 261)); // set object geometry


        tabSignal = new QWidget();
        tabSignal->setObjectName(QString::fromUtf8("tabSignal"));
        twSerial->addTab(tabSignal, QString(tr("Sattelite Power"))); // add widget "tabSignal" to tab widget


        tabRcv = new QWidget(); //widget
        tabRcv->setObjectName(QString::fromUtf8("tabRcv"));
        tbRcv = new QTextBrowser(tabRcv);
        tbRcv->setObjectName(QString::fromUtf8("tbRcv"));
        
        tbRcv->setLineWrapMode(QTextEdit::NoWrap);
        twSerial->addTab(tabRcv, QString(tr("Nmea"))); // add widget "tabRcv" to tab widget
       
        tabSend = new QWidget();
        tabSend->setObjectName(QString::fromUtf8("tabSend"));
        tbSend = new QTextBrowser(tabSend);
        tbSend->setObjectName(QString::fromUtf8("tbSend"));
        
        tbSend->setLineWrapMode(QTextEdit::NoWrap);
        twSerial->addTab(tabSend, QString(tr("Command"))); // add widget "tabRcv" to tab widget


        m_pillar = new SignalPillar(tabSignal,12); //SignalPillar 继承自 QGroupBox


        // init layout
        //注意: 上方的tbSend、tbRcv及m_pillar均未设置大小,其大小是通过下方的布局实现的自动调整
        {
                    QHBoxLayout *hlayout1 = new QHBoxLayout;
                    QHBoxLayout *hlayout2 = new QHBoxLayout;
                    QHBoxLayout *hlayout3 = new QHBoxLayout;
                    hlayout1->addWidget(tbSend);
                    hlayout1->setSpacing(1);
                    tabSend->setLayout(hlayout1); // init layout of tabSend
                    hlayout2->addWidget(tbRcv);
                    hlayout2->setSpacing(1);
                    tabRcv->setLayout(hlayout2); // init layout of tabRcv


                    hlayout3->addWidget(m_pillar);
                    tabSignal->setLayout(hlayout3); // init layout of tabSignal
        }
<<返回目录
---------------------------------------------------------------------------------------------


8. 布局(Layout)
布局一开始把我困惑住了,很长时间里一直不太明白,现在弄懂了一些基本的,感觉好多了。
布局其实就像是在画EXCEL表格一样,在草稿上,画出各个部分的区隔线,然后再用横向布局(QHBoxLayout)或纵向布局(QVBoxLayout)去套,这样就简单了。至于还有一个Grid的布局,我没有用到。
a. 示例
比如上方例子中出现的SignalPillar,是一排柱状条显示


如红色所点出的,该布局可以分为
1. 上方柱状的横向布局
2. 下方方框的横向布局
3. 兼容上下横向布局的纵向布局


b. 代码
void SignalPillar::createLayout()
{
    int i;
   
    QHBoxLayout *layoutMain = new QHBoxLayout; //主布局窗口
    QVBoxLayout *vlayoutPillar = new QVBoxLayout; //纵向布局
    QHBoxLayout *hlayoutsnr = new QHBoxLayout; //上方柱状横向布局
    QHBoxLayout *hlayoutprn = new QHBoxLayout; //下方方框横向布局


    vlayoutPillar->setSizeConstraint(QLayout::SetMaximumSize);
    hlayoutsnr->setSizeConstraint(QLayout::SetMaximumSize);
    hlayoutprn->setSizeConstraint(QLayout::SetFixedSize); //下方方框布局使用固定大小,为纵向布局的分布做准备


    i = 0;
    do{ //增加控件
        hlayoutsnr->addWidget(snrlabel[i]);
        hlayoutprn->addWidget(prnlabel[i]);
                i ;
    }while(i<m_maxdisp);
   
    hlayoutsnr->setSpacing(2);
    hlayoutprn->setSpacing(2);


    vlayoutPillar->addLayout(hlayoutsnr);
    vlayoutPillar->addLayout(hlayoutprn);
        vlayoutPillar->setSpacing(1);
   
        layoutMain->addLayout(vlayoutPillar); //添加到主布局窗口
    layoutMain->setSpacing(1);
    setLayout( layoutMain ); //设置布局,该语句不可省略
}


<<返回目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值