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 }

  程序點擊下載  關於自定義標題欄、最大化、最小化等功能,請參考我前面所寫的關於Qt實現360界面的博文...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM