1. 程式人生 > >Qt滑鼠實現伸縮滑動視窗

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 }
複製程式碼