近期,做專案用到無邊框窗體,令人蛋疼的是無邊框窗體大小的改變要像右邊框那樣,上下左右四周,而且要流暢。
網上也找了些**,發現居然還要連線到windows事件,這顯然不合常理,後來自己新建了demo,寫了乙個小時,問題太多了,扔一邊先不管了。
今天需要改進ui介面,沒辦法了,重新整理了下思路,沒想到做出來了。下面來分享下實現的過程,也許是菜鳥專欄,高手勿噴~
1.首先大家要了解各九宮格的概念
乙個窗體可以被劃分為上、下、左、右、左上、左下、右上、右下、中間,除了中間部分,其他都需要寫程式處理。
在程式中定義padding 為2,並同時定義列舉型別。
#define padding 2
enum direction ;2.定義乙個方法,引數為滑鼠目前的全域性位置。
void dialog::region(const qpoint &3.在對話方塊類中定義幾個私有成員變數cursorglobalpoint)
else
if(x >= rb.x() - padding && x <= rb.x() && y >= rb.y() - padding && y <=rb.y())
else
if(x <= tl.x() + padding && x >= tl.x() && y >= rb.y() - padding && y <=rb.y())
else
if(x <= rb.x() && x >= rb.x() - padding && y >= tl.y() && y <= tl.y() +padding)
else
if(x <= tl.x() + padding && x >=tl.x())
else
if( x <= rb.x() && x >= rb.x() -padding)
else
if(y >= tl.y() && y <= tl.y() +padding)
else
if(y <= rb.y() && y >= rb.y() -padding)
else
}
bool編寫對話方塊建構函式,初始化幾個變數並做一些其他工作。isleftpressdown; // 判斷左鍵是否按下
qpoint dragposition; // 視窗移動拖動時需要記住的點
direction dir; // 視窗大小改變時,記錄改變方向
isleftpressdown = false4.接著就要實現幾個重要的過載事件了;this->dir =none;
this->setminimumheight(100
);this->setminimumwidth(150
);this->setwindowflags(qt::framelesswindowhint|qt::windowsystemmenuhint); // 設定成無邊框對話方塊
this->setmousetracking(true
); // 追蹤滑鼠
this->setstylesheet("
qdialog
"); // 設定樣式背景色,可有可無
void mousereleaseevent(qmouseevent *event實現過程如下:);void mousemoveevent(qmouseevent *event
);void mousepressevent(qmouseevent *event);
void dialog::mousereleaseevent(qmouseevent *event到此為止,乙個無邊框窗體拖動並且改變大小的功能就實現了,run and debug it。) }
}void dialog::mousepressevent(qmouseevent *event)
else
break
;
case
qt::rightbutton:
this->close();
break
;
default
: qdialog::mousepressevent(
event
); }
}void dialog::mousemoveevent(qmouseevent *event)
else
this->setgeometry(rmove);
} else
}qdialog::mousemoveevent(
event);}
總結起來,這個演算法其實並不複雜,就看有幾個點能不能想到:
1)窗體矩形區域要轉換成在螢幕上的區域,我採取的方式就是取topleft和rightbottom兩個點來確定這個區域。
2)滑鼠移動要去全域性的座標。
3)region函式中判斷座標區間,然後改變滑鼠形狀,這塊很容易出錯,如果你一下子就寫出來,那我真的很佩服。
Qt 無邊框窗體改變大小 完美實現
近期,做專案用到無邊框窗體,令人蛋疼的是無邊框窗體大小的改變要像右邊框那樣,上下左右四周,而且要流暢。網上也找了些 發現居然還要連線到windows事件,這顯然不合常理,後來自己新建了demo,寫了乙個小時,問題太多了,扔一邊先不管了。今天需要改進ui介面,沒辦法了,重新整理了下思路,沒想到做出來了...
qt 無邊框窗體的拖到和改變大小
參考 這個類是關於無邊框窗體的拖動和改變大小的。如果是qwidget,請將繼承類改為qwidget,並將原始檔的qdialog用qwidget替換。我曾想將這個類作為中間類,讓視窗類繼承此類,這樣如果有多個無邊框視窗,就不用每個視窗都作重複改變了,但是沒有成功。由於時間關係,沒再做深入研究。以後有時...
無邊框窗體拖動和改變大小
const int htleft 10 const int htright 11 const int httop 12 const int httopleft 13 const int httopright 14 const int htbottom 15 const int htbottomlef...