Qt 無邊框窗體改變大小 完美實現

2021-06-25 11:26:30 字數 2668 閱讀 6121

近期,做專案用到無邊框窗體,令人蛋疼的是無邊框窗體大小的改變要像右邊框那樣,上下左右四周,而且要流暢。

網上也找了些**,發現居然還要連線到windows事件,這顯然不合常理,後來自己新建了demo,寫了乙個小時,問題太多了,扔一邊先不管了。

今天需要改進ui介面,沒辦法了,重新整理了下思路,沒想到做出來了。下面來分享下實現的過程,也許是菜鳥專欄,高手勿噴~

1.首先大家要了解各九宮格的概念

乙個窗體可以被劃分為上、下、左、右、左上、左下、右上、右下、中間,除了中間部分,其他都需要寫程式處理。

在程式中定義padding 為2,並同時定義列舉型別。

#define padding 2
enum 

direction ;

2.定義乙個方法,引數為滑鼠目前的全域性位置。

void dialog::region(const qpoint &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

}

3.在對話方塊類中定義幾個私有成員變數

bool

isleftpressdown; // 判斷左鍵是否按下

qpoint dragposition; // 視窗移動拖動時需要記住的點

direction dir; //

視窗大小改變時,記錄改變方向

編寫對話方塊建構函式,初始化幾個變數並做一些其他工作。

isleftpressdown = false

;this->dir =none;

this->setminimumheight(100

);this->setminimumwidth(150

);this->setwindowflags(qt::framelesswindowhint|qt::windowsystemmenuhint); // 設定成無邊框對話方塊

this->setmousetracking(true

);                    // 追蹤滑鼠

this->setstylesheet("

qdialog

"); // 設定樣式背景色,可有可無

4.接著就要實現幾個重要的過載事件了

void mousereleaseevent(qmouseevent *event

);void mousemoveevent(qmouseevent *event

);void mousepressevent(qmouseevent *event);

實現過程如下:

void dialog::mousereleaseevent(qmouseevent *event

) }

}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

);}

到此為止,乙個無邊框窗體拖動並且改變大小的功能就實現了,run and debug it。

總結起來,這個演算法其實並不複雜,就看有幾個點能不能想到:

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...