1. 程式人生 > >Qt實現視窗的無邊框化且可拉伸大小

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