Chinaunix首页 | 论坛 | 博客
  • 博客访问: 426286
  • 博文数量: 32
  • 博客积分: 1843
  • 博客等级: 上尉
  • 技术积分: 634
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-25 14:30
个人简介

Nothing is impossible

文章分类

全部博文(32)

文章存档

2013年(4)

2012年(13)

2011年(6)

2008年(9)

分类: C/C++

2012-12-05 16:06:02

QT学习小结(二)

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



PART II  (布局相关)



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

示例
a. 创建如下的TabWidget


b. 代码

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

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

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

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

  25.         tabRcv = new QWidget(); //widget
  26.         tabRcv->setObjectName(QString::fromUtf8("tabRcv"));
  27.         tbRcv = new QTextBrowser(tabRcv);
  28.         tbRcv->setObjectName(QString::fromUtf8("tbRcv"));
  29.        
  30.         tbRcv->setLineWrapMode(QTextEdit::NoWrap);
  31.         twSerial->addTab(tabRcv, QString(tr("Nmea"))); // add widget "tabRcv" to tab widget
  32.        
  33.         tabSend = new QWidget();
  34.         tabSend->setObjectName(QString::fromUtf8("tabSend"));
  35.         tbSend = new QTextBrowser(tabSend);
  36.         tbSend->setObjectName(QString::fromUtf8("tbSend"));
  37.        
  38.         tbSend->setLineWrapMode(QTextEdit::NoWrap);
  39.         twSerial->addTab(tabSend, QString(tr("Command"))); // add widget "tabRcv" to tab widget

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

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

  53.                     hlayout3->addWidget(m_pillar);
  54.                     tabSignal->setLayout(hlayout3); // init layout of tabSignal
  55.         }

---------------------------------------------------------------------------------------------

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

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

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

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

  12.     i = 0;
  13.     do{ //增加控件
  14.         hlayoutsnr->addWidget(snrlabel[i]);
  15.         hlayoutprn->addWidget(prnlabel[i]);
  16.                 i ;
  17.     }while(i<m_maxdisp);
  18.    
  19.     hlayoutsnr->setSpacing(2);
  20.     hlayoutprn->setSpacing(2);

  21.     vlayoutPillar->addLayout(hlayoutsnr);
  22.     vlayoutPillar->addLayout(hlayoutprn);
  23.         vlayoutPillar->setSpacing(1);
  24.    
  25.         layoutMain->addLayout(vlayoutPillar); //添加到主布局窗口
  26.     layoutMain->setSpacing(1);
  27.     setLayout( layoutMain ); //设置布局,该语句不可省略
  28. }


---------------------------------------------------------------------------------------------

阅读(7389) | 评论(0) | 转发(2) |
0

上一篇:QT学习小结(一)

下一篇:QT学习小结(三)

给主人留下些什么吧!~~