Qt仿win7自動頂部最大化左側右側半屏效果

2021-07-30 15:06:37 字數 1345 閱讀 9091

win7系統不得不說是非常好用的,也是目前為止占用份額最大的作業系統,其中win7有個效果,將窗體拖動到頂部時會自動最大化,拖動到左側右側時會自動半屏顯示,再次拖動窗體到其他位置,會重新恢復之前的大小,這個效果還是比較人性化的,大大方便了很多使用者的操作習慣。

在qt中,如果是無邊框窗體,(有邊框窗體和作業系統窗體效果一致)並沒有相關的api介面來實現這個效果,必須自己寫**來模擬這個效果,原理很簡單,繫結事件過濾器,自動計算當前無邊框窗體的位置和滑鼠按下去的座標,當到達頂部或者左側右側時,自動設定該窗體的geometry即可。

為了復用**,我這裡繫結的全域性事件過濾器,這樣只需要無邊框窗體介面設定兩行即可,無需重複編碼。

無邊框窗體**:

this->setproperty("canmove", true);

this->setwindowflags(qt::framelesswindowhint | qt::windowsystemmenuhint | qt::windowminmaxbuttonshint);

核心**:

#include "qdesktopwidget.h"

#include "qevent.h"

#include "qwidget.h"

#include "qdebug.h"

//儲存桌面寬高以及全屏/左側半屏/右側半屏 區域

static qrect leftrect = qrect(0, 0, deskwidth / 2, deskheight);

static qrect rightrect = qrect(deskwidth / 2, 0, deskwidth / 2, deskheight);

bool autorect = w->property("autorect").tobool();

static qpoint mousepoint;

static bool mousepressed = false;

qmouseevent *event = static_cast(evt);

if (event->type() == qevent::mousebuttonpress)

} else if (event->type() == qevent::mousebuttonrelease) else if (x < offset) else if (x > (deskwidth - offset))

}return true;

} else if (event->type() == qevent::mousemove) else

return true;}}

return qobject::eventfilter(obj, evt);}

WPF程式禁止win7視窗自動最大化

相信用過windows7的朋友都知道,當我們將某個視窗拖拽到螢幕的頂部時視窗就會自動最大化,拖動到螢幕左右測邊緣時,視窗會佔據半個螢幕大小。這是windows7帶來的新功能新亮點之一。但是如果在具體專案具體需求時,windows7的這種特性往往會阻礙我們意願,成為我們的絆腳石。那麼該篇文章介紹,wp...

WPF程式禁止win7視窗自動最大化

相信用過windows7的朋友都知道,當我們將某個視窗拖拽到螢幕的頂部時視窗就會自動最大化,拖動到螢幕左右測邊緣時,視窗會佔據半個螢幕大小。這是windows7帶來的新功能新亮點之一。但是如果在具體專案具體需求時,windows7的這種特性往往會阻礙我們意願,成為我們的絆腳石。那麼該篇文章介紹,wp...

Win7視窗最大化和最小化快捷鍵

windows 鍵 方向鍵 使當前使用的視窗最大化。windows 鍵 方向鍵 使當前使用中的最大化視窗恢復正常顯示 或者如果當前視窗不是最大化狀態,則會將其最小化。windows 鍵 方向鍵 windows 鍵 方向鍵 aero snap 使正在使用中的視窗貼向螢幕左側 右側,而只占用50 的顯示...