QT 自定義邊框,可伸縮,延伸, 拖動

2021-09-26 23:38:58 字數 2970 閱讀 4741

有時為了美觀,會自己製作邊框, 這就意味著,你完成上述功能,要實現三個功能:

<1>窗體可自由 伸縮. 可大可小.

<2>窗體可隨著滑鼠移動

<3>自己實現標題欄(包含 最小化,最大化,關閉)

那麼就按照上述的順序來講解:

1:有時你會發現,當滑鼠放在邊框邊時 滑鼠會有變化,(箭頭向上,向下, 向左,向右, 左上.... )
思路:

計算出這9個區域的 rect ,然後根據滑鼠停放的 pos 在哪個位置, 來設定滑鼠的形狀

滑鼠 設定 可檢視 文件 qcursor,

**如下:

enum location;

location site_flag;

void widget::set_cursor(qmouseevent *event)

else if(bottom_.contains(event->pos()))

else if(left_.contains(event->pos()))

else if(right_.contains(event->pos()))

else if (top_left.contains(event->pos()))

else if (top_right.contains(event->pos()))

else if (bottom_left.contains(event->pos()))

else if(bottom_right.contains(event->pos()))

else

}

2:當滑鼠發生變化時 進行,拖動

思路:窗體有他的最小 height ,width , 當伸縮時 相對距離大於 他的最小 height 和 width 才允發生變化

注意;窗體的原點在左上角. 通過x() , y() 就可以獲取,;通過 setx() ,sety()設定他的左上的的位置

void widget::set_stretch(qmouseevent *event)

this->setgeometry(rmove);

break;

case top:

if (bottomright.y() - glopoint.y() > this->minimumheight())

this->setgeometry(rmove);

break;

case right:

if (glopoint.x() - bottomleft.x() > this->minimumwidth())

this->setgeometry(rmove);

break;

case bottom:

if (glopoint.y() - topright.y() > this->minimumheight())

this->setgeometry(rmove);

break;

case left_top:

// 和上面的判斷有點不一樣,這快判斷的是 相對距離小於 最小size

//將左上 分為左邊,上邊兩部分

if ((bottomright.y() - glopoint.y() <= this->minimumheight()) )

else if( (bottomright.x() - glopoint.x() <= this->minimumwidth()))

else

this->setgeometry(rmove);

break;

case right_top:

if (bottomright.y() - glopoint.y() <= this->minimumheight())

else if(( glopoint.x() - bottomleft.x() <= this->minimumwidth()))

else

this->setgeometry(rmove);

break;

case left_bottm:

if(bottomright.x() - glopoint.x() <= this->minimumwidth())

else if(glopoint.y() - topleft.y() <= this->minimumheight())

else

this->setgeometry(rmove);

break;

case right_botm:

if( glopoint.y() - topleft.y() <= this->minimumheight())

else if(( glopoint.x() - bottomleft.x() <= this->minimumwidth()))

else

this->setgeometry(rmove);

break;

case middle:

//當滑鼠停放在中間的時候, 那麼這個操作就是拖動.

window()->move(window()->pos() + glopoint - current_pos);

current_pos = glopoint;

default:

event->ignore();

break;

}hb->setcontentsmargins(0,0,0,this->height()-30);

}

上面的其實已經有了:

當滑鼠停放在 middle 的區域,就是拖動了.

具體可看,標題欄製作,的部落格,裡面有講解

(實現**在 widget class 中 .my_test 為 測試 的子類)

c 自定義可拖動變形控制項

public class 控制項移動變形類 usercontrol 控制項類 rectangle 傳遞控制項 傳遞控制項相對於本控制項的範圍 rectangle 本控制項 本控制項相對於自己的範圍 rectangle 調節點邊框 new rectangle 8 8個點相對於本控制項的範圍 recta...

可自由拖動的自定義元件

通過監聽元件touch事件,來改變元件的left和top的樣式 1.首先,touchstart時,拿到元件初始狀態時的位置 2.touchmove,實時拿到元件的位置,並修改元件的left和top的值 3.如果要求吸附到旁邊,在touchend時,看最後元件的位置是偏向於左邊還是右邊,如果偏向於左邊...

Qt之自定義介面(實現無邊框 可移動)

ui設計是指對軟體的人機互動 操作邏輯 介面美觀的整體設計。好的ui設計不僅是讓軟體變得有個性 有品位,還要讓軟體的操作變得舒適簡單 自由,充分體現軟體的定位和特點。愛美之心人皆有之。其實軟體介面就像工業造型一樣,是產品的重要賣點。乙個產品擁有美觀的介面會給人帶來舒適的視覺享受,拉近人與產品的距離,...