QT学习小结(二)
学习使用QT有段时间了,初步先做下小结,留作备忘。
PART II (布局相关)
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 ); //设置布局,该语句不可省略
- }
---------------------------------------------------------------------------------------------
阅读(2204) | 评论(0) | 转发(0) |