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