最近接的幾個私活,用戶都要求實現能伸縮滑動的窗口,即窗口的中央有滑動條可以動態改變子窗口的大小;於是我覺得有必要把這部分整理並寫出來,因為畢竟伸縮滑動窗口在實際環境中應用挺多的,同時許多流行的軟件也使用這個功能。最后實現出來的效果圖如下:
初始界面
鼠標移到滑動條時出現按鈕
窗口滑動狀態
右邊窗口最小化
下面我大概講解下如何實現這個功能。
一、創建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界面的博文...