QT实现伸缩窗口

 最近碰到用户要求实现能伸缩滑动的窗口,即窗口的中央有滑动条可以动态改变子窗口的大小;于是我觉得有必要把这部分整理并写出来,因为毕竟伸缩滑动窗口在实际环境中应用挺多的,同时许多流行的软件也使用这个功能。最后实现出来的效果图如下:

初始界面

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

窗口滑动状态

右边窗口最小化

  下面我大概讲解下如何实现这个功能。
一、创建Qt GUI应用程序
  这一步我就不详细说了,只要使用Qt Creator 一步一步创建即可;假如生成的主界面是MainFrame,那么我们所要做的就是在MainFrame文件中添加窗口滑动功能,使用QSplitter类,然后对主窗口增加布局即可。
二、增加子窗口
  QSplitter类划分水平左右两个窗口,同时需要添加一个按钮来对最右边的窗口显示和隐藏。
  在构造函数里分别对这些部件进行初始化处理:

复制代码
 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 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 void QClockFrame::resizeEvent(QResizeEvent *event)
2 {
3     setBtnPos();
4     QFrame::resizeEvent(event);
5 }

  最后还需要对事件进行过滤,即eventFilter函数,对按钮的显示隐藏进行判断。
四、逻辑处理
  按钮的图标处理以及位置处理,主要是setBtnIcon和setBtnPos函数:

复制代码
 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 void QClockFrame::slot_splitterMoved(int pos, int index)
2 {
3     setBtnPos();
4     if(m_pListFrame->width()==0)
5     {
6         setBtnIcon();
7     }
8 }
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值