Qt實現視窗的無邊框化且可拉伸大小
簡述
大家在做Qt的時候,經常都會遇到自定義QWidget吧,但一旦實現後,有變的不可以拉伸了,今天我們就來做一個可拉伸的自定義QWidget並且可以移動
實現
#ifndef AUTOSIZEWIDGET_H
#define AUTOSIZEWIDGET_H
#include "basewidget.h"
//這是mainWindow的基類,繼承與QWidget,實現了可拉伸大小
enum Direction {
UP, DOWN, LEFT, RIGHT, LEFTTOP, LEFTBOTTOM, RIGHTBOTTOM, RIGHTTOP, NONE
};
class AutoSizeWidget : public QWidget
{
Q_OBJECT
public:
AutoSizeWidget(QWidget *parent=0);
~AutoSizeWidget();
protected:
void mouseMoveEvent(QMouseEvent *) override;
void mousePressEvent(QMouseEvent *) override;
void mouseReleaseEvent(QMouseEvent *) override;
private:
void judgeRegionSetCursor(const QPoint&);
const int Padding = 2;
bool isLeftPressDown; // 判斷左鍵是否按下
QPoint dragPosition; // 視窗移動拖動時需要記住的點
// 視窗大小改變時,記錄改變方向
Direction dir;
};
#endif // AUTOSIZEWIDGET_H
cpp檔案
#include "autosizewidget.h"
AutoSizeWidget::AutoSizeWidget(QWidget *parent)
: QWidget(parent)
{
isLeftPressDown = false ;
dir = NONE;
// 追蹤滑鼠
this->setMouseTracking(true);
}
void AutoSizeWidget::judgeRegionSetCursor(const QPoint& currentPoint)
{
// 獲取窗體在螢幕上的位置區域,tl為topleft點,rb為rightbottom點
QRect rect = this->rect();
QPoint tl = mapToGlobal(rect.topLeft());
QPoint rb = mapToGlobal(rect.bottomRight());
int x = currentPoint.x();
int y = currentPoint.y();
if (tl.x() + Padding >= x && tl.x() <= x && tl.y() + Padding >= y && tl.y() <= y) {
// 左上角
dir = LEFTTOP;
this->setCursor(QCursor(Qt::SizeFDiagCursor)); // 設定滑鼠形狀
}
else if (x >= rb.x() - Padding && x <= rb.x() && y >= rb.y() - Padding && y <= rb.y()) {
// 右下角
dir = RIGHTBOTTOM;
this->setCursor(QCursor(Qt::SizeFDiagCursor));
}
else if (x <= tl.x() + Padding && x >= tl.x() && y >= rb.y() - Padding && y <= rb.y()) {
//左下角
dir = LEFTBOTTOM;
this->setCursor(QCursor(Qt::SizeBDiagCursor));
}
else if (x <= rb.x() && x >= rb.x() - Padding && y >= tl.y() && y <= tl.y() + Padding) {
// 右上角
dir = RIGHTTOP;
this->setCursor(QCursor(Qt::SizeBDiagCursor));
}
else if (x <= tl.x() + Padding && x >= tl.x()) {
// 左邊
dir = LEFT;
this->setCursor(QCursor(Qt::SizeHorCursor));
}
else if (x <= rb.x() && x >= rb.x() - Padding) {
// 右邊
dir = RIGHT;
this->setCursor(QCursor(Qt::SizeHorCursor));
}
else if (y >= tl.y() && y <= tl.y() + Padding) {
// 上邊
dir = UP;
this->setCursor(QCursor(Qt::SizeVerCursor));
}
else if (y <= rb.y() && y >= rb.y() - Padding) {
// 下邊
dir = DOWN;
this->setCursor(QCursor(Qt::SizeVerCursor));
}
else {
// 預設
dir = NONE;
this->setCursor(QCursor(Qt::ArrowCursor));
}
}
void AutoSizeWidget::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton) {
isLeftPressDown = false;
if (dir != NONE) {
this->releaseMouse();
this->setCursor(QCursor(Qt::ArrowCursor));
}
}
}
void AutoSizeWidget::mousePressEvent(QMouseEvent *event)
{
switch (event->button()) {
case Qt::LeftButton:
isLeftPressDown = true;
if (dir != NONE) {
this->mouseGrabber();
}
else {
dragPosition = event->globalPos() - this->frameGeometry().topLeft();
}
break;
default:
QWidget::mousePressEvent(event);
}
}
void AutoSizeWidget::mouseMoveEvent(QMouseEvent *event)
{
QPoint gloPoint = event->globalPos();
QRect rect = this->rect();
QPoint tl = mapToGlobal(rect.topLeft());
QPoint rb = mapToGlobal(rect.bottomRight());
if (!isLeftPressDown) {
this->judgeRegionSetCursor(gloPoint);
}
else {
if (dir != NONE) {
QRect rMove(tl, rb);
switch (dir) {
case LEFT:
if (rb.x() - gloPoint.x() <= this->minimumWidth())
rMove.setX(tl.x());
else
rMove.setX(gloPoint.x());
break;
case RIGHT:
rMove.setWidth(gloPoint.x() - tl.x());
break;
case UP:
if (rb.y() - gloPoint.y() <= this->minimumHeight())
rMove.setY(tl.y());
else
rMove.setY(gloPoint.y());
break;
case DOWN:
rMove.setHeight(gloPoint.y() - tl.y());
break;
case LEFTTOP:
if (rb.x() - gloPoint.x() <= this->minimumWidth())
rMove.setX(tl.x());
else
rMove.setX(gloPoint.x());
if (rb.y() - gloPoint.y() <= this->minimumHeight())
rMove.setY(tl.y());
else
rMove.setY(gloPoint.y());
break;
case RIGHTTOP:
rMove.setWidth(gloPoint.x() - tl.x());
rMove.setY(gloPoint.y());
break;
case LEFTBOTTOM:
rMove.setX(gloPoint.x());
rMove.setHeight(gloPoint.y() - tl.y());
break;
case RIGHTBOTTOM:
rMove.setWidth(gloPoint.x() - tl.x());
rMove.setHeight(gloPoint.y() - tl.y());
break;
default:
break;
}
this->setGeometry(rMove);
}
else {
move(event->globalPos() - dragPosition);
event->accept();
}
}
QWidget::mouseMoveEvent(event);
}
AutoSizeWidget::~AutoSizeWidget()
{
}
相關推薦
Qt實現視窗的無邊框化且可拉伸大小
簡述 大家在做Qt的時候,經常都會遇到自定義QWidget吧,但一旦實現後,有變的不可以拉伸了,今天我們就來做一個可拉伸的自定義QWidget並且可以移動 實現 #ifndef AUTOSIZEWIDGET_H #define AUTOSIZEWIDG
Qt自定義無邊框介面(可放大、縮小及拖動)
Qt自定義無邊框介面 使用者介面(User Interface)是指對軟體的人機互動、操作邏輯、介面美觀的整體設計。好的UI設計不僅是讓軟體變得有個性有品味,還要讓軟體的操作變得舒適、簡單、自由、充分體現軟體的定位和特點。很多時候,Qt本地樣式可能無法實現讓我們的介面更簡化、美觀,那麼這
Qt開發:無邊框異形視窗,透明背景,可移動
很多端遊的啟動器客戶端都是異形視窗,無邊框,自繪並重寫了最小化、最大化、關閉按鈕。本文具體講一下實現。 步驟: 1,設定視窗透明度、視窗無邊框樣式、視窗背景透明。 2,準備ps過的帶透明通道的不規則png圖片,設定為視窗背景。 3,重寫滑鼠事件實現視窗移動。 看效果:
QML實現的無邊框視窗的拉伸,拖拽,基本解決閃爍嚴重問題
使用qt製作的無邊框視窗,只需在其flag中加入FramelessWindowHint。然而,無邊框視窗意味著,無法使用原有的邊框拉伸,拖拽功能。在qwidget中,有很多實現的方法,比如重寫 + mouseMoveEvent(QMouseEvent *event)
QT自定義視窗(無邊框,自由拖動)
做專案中為了美觀,很少使用QT自帶的標題欄,取消邊框,自己實現邊框。自定義視窗,主要通過滑鼠事件實現。重寫QT視窗事件,具體參考程式碼註釋。 #ifndef CUSTOMWINDOW_H #defi
QT 建立一個 可移動、可拉伸的無邊框窗體
在使用QT建立窗體的時候,為了使視窗美化,通常不使用QT自帶的邊框。會呼叫下面函式去除窗體邊框。setWindowFlags(Qt::FramelessWindowHint) 但是有個問題,當去除了QT自帶邊框後,窗體就變得不能移動了,也不能改變視窗大小了。這確
WPF一步步實現完全無邊框自定義Window(附源碼)
nbsp interop -c 思路 pan cit 最終 auto pre 在我們設計一個軟件的時候,有很多時候我們需要按照美工的設計來重新設計整個版面,這當然包括主窗體,因為WPF為我們提供了強大的模板的特性,這就為我們自定義各種空間提供了可能性,這篇博客主要用來
CreateWindow創建無邊框 可拉伸窗體
relative ply pos manage erl more except tool 傳遞 createwindow 定義 HWND WINAPI CreateWindow( _In_opt_ LPCTSTR lpClassName, _In_opt_ L
無邊框對話方塊拖動改變大小的實現總結
UINT CTestDlg::OnNcHitTest( CPoint point ) { CPoint ptCur; CRect rect; GetCursorPos( &ptCur ); GetWindowRect( &rect ); if( CRect(rect.left, rect.
C#實現視窗最小化到系統托盤
this.NicontextMenu.MenuItems.AddRange( new System.Windows.Forms.MenuItem[] { this.menuItem_Hide, this.menuItem_Show, this.menuItem_Aubot, this.menuItem_Exi
QWidget無邊框無標題欄窗體 可拖動可拉伸
通常我們不想使用QMainWindow提供的標題欄,或者是QWidget的標題欄、邊框,這時候我們使用了一個普通的QWidget,沒有標題欄沒有邊框,但我們又需要有標題欄拖動的功能,邊框改變大小的功能,看上去是個很矛盾的想法,所以...我們只能自己實現了。
QT 視窗設定可拉伸背景圖
voidWidget::setBackground() { constQStringfilePath=QDir::currentPath()+QLatin1String("/images/backg
Qt自定義無邊框Widget、Dialog、MessageBox
如果需要做出更漂亮的窗體介面,那麼實現無邊框的widget是非常有必要的。本文就實現了無邊框的widget、Dialog、MessageBox等一些常用的控制元件,進行了一些美化,可以拖動、縮放、雙擊標題欄最大化還原等操作,並且能夠實現windwos下的
VC++ 實現 視窗最小化 MFC
所謂的“托盤”,在Windows系統介面中,指的就是下面任務條右側,有系統時間等等的標誌的那一部分。在程式最小化或掛起時,但有不希望佔據工作列的時候,就可以把程式放到托盤區。 一 、原理 1、最小化的原理:首先要將視窗隱藏,然後 在右下角繪製圖標。 2、恢復的原理:將視窗
Qt實現視窗整體拖拽功能.
我們都知道,當我們滑鼠點選並移動應用程式的上邊框時,窗口才會整體移動,但有些視窗,你點選移動其他部分,也可以讓視窗跟著滑鼠移動,這裡就教你如何整體移動視窗. 其實實現這樣的功能很簡單,只需要重寫以下的
css解決 多張圖片如何統一大小 且沒拉伸問題
1. 測試案例 需求: 要求表情庫裡所有表情包大小都固定 實際效果: 由於圖片原始大小都不一樣,強行設定大小值會導致拉伸,如果不設定大小則參差不齊。例如: //html <body> <img src="1.jpg" /> <
iOS 實現類似安卓.9.png圖片拉伸效果
// >= ios 5.0 UIImage *image = [[UIImage imageNamed:@"bg_box"] resizableImageWithCapInsets:UIEdgeInsetsMake(0,10,0,10)]; // < io
JQuery經典例子:可拉伸選單
簡介: 幾乎所有的網頁都會有可以伸縮的選單,它的實現也比較簡單。可伸縮的選單實現的思路是這樣的:在HTML中將 選單寫好,在css中將選單的樣式設定好並且將二級選單隱藏起來,最後就是在
Android開發網路圖片完整顯示且不拉伸
需求:由上往下載入多張網路圖片,滿橫屏完整顯示且不拉伸。 這裡有幾個問題要解決的,一個是網路圖片,一個是完整顯示,一個是圖片不能出現拉伸問題。 解決思路:不拉伸完整顯示只有等比例縮放圖片,ImageView.ScaleType.CENTE
Qt實現半透明、無邊框、可自由移動、不規則的窗體
先出示效果圖一張,如果不是讀者需要的,讀者可以看完效果圖之後就關閉本網頁啦。 功能要點 視窗無邊框 可自由拖動 背景透明度自定義 邊框可設定為異形 實現步驟 第1步:新建一個QWidget的子類,這裡命名為BaseWidge