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 ); //设置布局,该语句不可省略
}
<<返回目录