有時為了美觀,會自己製作邊框, 這就意味著,你完成上述功能,要實現三個功能:
<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設計不僅是讓軟體變得有個性 有品位,還要讓軟體的操作變得舒適簡單 自由,充分體現軟體的定位和特點。愛美之心人皆有之。其實軟體介面就像工業造型一樣,是產品的重要賣點。乙個產品擁有美觀的介面會給人帶來舒適的視覺享受,拉近人與產品的距離,...