dxfans的个人主页

http://www.qtcn.org/bbs/u/119684  [收藏] [复制]

dxfans

www.hnmade.com

  • 27

    关注

  • 81

    粉丝

  • 616

    访客

  • 等级:侠客
  • 总积分:218
  • 男,1985-05-08

最后登录:2015-03-05

更多资料

日志

Qt私活之实现伸缩滑动窗口

2012-12-21 10:38
摘自Qt开发者驿站       
最近接的几个私活,用户都要求实现能伸缩滑动的窗口,即窗口的中央有滑动条可以动态改变子窗口的大小;于是我觉得有必要把这部分整理并写出来,因为毕竟伸缩滑动窗口在实际环境中应用挺多的,同时许多流行的软件也使用这个功能。最后实现出来的效果图如下:
                            初始界面

                     鼠标移到滑动条时出现按钮

                            窗口滑动状态

                     右边窗口最小化
       下面我大概讲解下如何实现这个功能。
一、创建Qt GUI应用程序
  这一步我就不详细说了,只要使用Qt Creator 一步一步创建即可;假如生成的主界面是MainFrame,那么我们所要做的就是在MainFrame文件中添加窗口滑动功能,使用QSplitter类,然后对主窗口增加布局即可。
二、增加子窗口
  QSplitter类划分水平左右两个窗口,同时需要添加一个按钮来对最右边的窗口显示和隐藏。
  在构造函数里分别对这些部件进行初始化处理:
  1. 1 m_pSplitter = new QSplitter(this);
    2 m_pSplitter->addWidget(m_pContentFrame);
    3 m_pSplitter->addWidget(m_pListFrame);
    4 m_pSplitter->handle(1)->installEventFilter(this);
    5 m_pSplitter->setHandleWidth(1);
    6 connect(m_pSplitter,SIGNAL(splitterMoved(int,int)),this,SLOT(slot_splitterMoved(int,int)));
    7
    8 m_pButton = new QPushButton(this);
    9 m_pButton->setVisible(false);
    10 m_pButton->setFixedSize(13,42);
    11 m_pButton->setIconSize(QSize(13,42));
    12 m_pButton->setStyleSheet("border:none;");
    13 connect(m_pButton,SIGNAL(clicked()),this,SLOT(slot_bntClicked()));

三、事件处理
  由于初始我们不知道各个窗口子部件的大小,所以覆盖showEvent事件进行初始处理:
  1. 1 if(!m_bInitShow)
    2 {
    3 setSizeSplitter(m_pSplitter->width()-180,180-m_pSplitter->handleWidth());
    4 setBtnPos();
    5 setBtnIcon();
    6 m_bInitShow = true;
    7 }
    8 QFrame::showEvent(event);
       在窗口大小发生变化时,也需要做些处理,所以覆盖resizeEvent进行位置处理:
  1. 1 void QClockFrame::resizeEvent(QResizeEvent *event)
    2 {
    3     setBtnPos();
    4     QFrame::resizeEvent(event);
    5 }

       最后还需要对事件进行过滤,即eventFilter函数,对按钮的显示隐藏进行判断。
四、逻辑处理
  按钮的图标处理以及位置处理,主要是setBtnIcon和setBtnPos函数:
  1. 1 void QClockFrame::setBtnIcon()
    2 {
    3     if(m_pListFrame->width()!=0)
    4     {
    5         m_pButton->setIcon(QIcon(":/image/right.bmp"));
    6     }
    7     else
    8     {
    9         m_pButton->setIcon(QIcon(":/image/left.bmp"));
    10     }
    11 }
    12
    13 void QClockFrame::setBtnPos()
    14 {  m_pButton->move(m_pContentFrame->width()-m_pButton->width(),(m_pContentFrame->height()-m_pButton->height())/2);
    15 }

五、信号槽处理  即滑动时的处理情况
  1. 1 void QClockFrame::slot_splitterMoved(int pos, int index)
    2 {
    3     setBtnPos();
    4     if(m_pListFrame->width()==0)
    5     {
    6         setBtnIcon();
    7     }
    8 }

程序点击下载   关于自定义标题栏、最大化、最小化等功能,请参考我前面所写的关于Qt实现360界面的博文...
摘自Qt开发者驿站

分类:默认分类|回复:0|浏览:2210|全站可见
 

Powered by phpwind v8.7 Certificate Copyright Time now is:03-29 00:51
©2005-2016 QTCN开发网 版权所有 Gzip disabled