網站首頁 編程語言 正文
常見的窗體通常是各種各樣方形的對話框,但有時候也需要使用非方形的對話框。如圓形、橢圓形、甚至一些不規則形狀的對話框。
利用setMask()函數為窗體設置遮罩,實現不規則窗體。設置遮罩后的窗體尺寸仍是原窗體大小,只是被這照的地方不可見。
案例:
不規則窗體的實現方法。具體實現一塊水晶石圖形外沿形狀的不規則形狀對話框,也可以在不規則窗體上放置按鈕等控件,可以通過鼠標左鍵拖拽窗體,右擊鼠標關閉窗體,運行效果如下:
實現步驟如下:
(1)建立項目“ShapeWidget”,基類選擇“QWidget”,類名為“widget",取消“創建界面”復選框的選中狀態。
(2)不規則窗體類ShapeWidget繼承QWidget類,為了使不規則窗體能夠通過鼠標隨意拖拽,在該類中重定義了鼠標事件函數mousePressEvent()、mouseMoveEvent()及重繪函數paintEvent()。
protected:
void mouseMoveEvent(QMouseEvent *);
void mousePressEvent(QMouseEvent *);
void paintEvent(QPaintEvent *);
private:
QPoint dragPosition;
注意添加頭文件
#include <QMouseEvent>
#include <QPainter>
#include <QPixmap>
#include <QBitmap>
(3)widget.cpp的構造函數部分是實現不規則窗體的關鍵,具體代碼如下:
#include "widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
QPixmap pix;
/* 調用QPixmap的load()函數為QPixmap對象填入圖象值 */
pix.load("D:/QT/QT_blog/ShapeWidget/24.png",0,Qt::AvoidDither|Qt::ThresholdAlphaDither|Qt::ThresholdDither);
resize(pix.size()); //設置主窗體的尺寸為所讀取的圖片的大小
setMask(QBitmap(pix.mask()));
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
if(event->buttons()&Qt::LeftButton)
{
move(event->globalPos()-dragPosition);
event->accept();
}
}
void Widget::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
dragPosition = event->globalPos()-frameGeometry().topLeft();
event->accept();
}
if(event->button() == Qt::RightButton)
{
close();
}
}
void Widget::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawPixmap(0,0,QPixmap("D:/QT/QT_blog/ShapeWidget/24.png"));
}
Widget::~Widget()
{
}
其中,
(a)load()函數原型:?
bool load(const QString& fileName, const char *format = nullptr, Qt::ImageConversionFlags flags = Qt::AutoColor);
參數fileName為圖片文件名;參數format表示讀取圖片文件采用的格式,此處為0,表示采用默認格式;參數flags表示讀取圖片的方式,由Qt::ImageConversionFlags定義,此處設置的標識為避免圖片抖動方式。
(b)setMask(QBitmap(pix.mask())):為調用他的控件增加一個遮罩,遮住所選區域以外的部分使其看起來是透明的,它的參數可為一個QBitmap對象或者一個QRegion對象,此處調用QPixmap的mask()函數用于獲得圖片自身的遮罩,為一個QBitmap對象,實例中用的是PNG格式的圖片,它的透明部分實際上是一個遮罩。
? ? ? ?使不規則窗體能夠響應鼠標事件、隨意拖曳的函數,是重定義的鼠標按下響應函數mousePressEvent(QMouseEvent *),首先判斷按下的是否為鼠標左鍵。若是,則保存當前鼠標點所在的位置相對于窗體左上角的偏移值drgPosition;若按下的是鼠標石鍵,則關團窗體。
? ? ? 鼠標移動響應函數mouseMoveEvent(QMouseEvent*),首先判斷當前鼠標狀態,調用even->
buttons()返回鼠標的狀態,若為左鍵則調用QWidget的move()函數將窗體移動至鼠標當前點。
由于move)函數的參數指的是窗體的左上角的位置,因此要使用鼠標當前點的位置減去相對窗
體左上角的偏移值dragPosition。
? ? ? ?重繪函數paintEvent()主要完成在窗體上繪制圖片的制作。此處為方便顯示在窗體上,所繪制的是用來確定窗體外形的PNG圖片。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
原文鏈接:https://blog.csdn.net/m0_60440984/article/details/126022703
- 上一篇:if-else和switch的練習及區別比較
- 下一篇:Linux的磁盤配額設置
相關推薦
- 2022-06-30 Pyqt實現簡易計算器功能_python
- 2022-09-24 python的numpy模塊實現邏輯回歸模型_python
- 2022-07-04 C語言植物大戰數據結構堆排序圖文示例_C 語言
- 2022-06-23 分布式醫療掛號系統整合Gateway網關解決跨域問題_其它綜合
- 2022-07-27 C++詳細講解圖論的基礎與圖的儲存_C 語言
- 2022-07-02 Python?matplotlib繪圖時指定圖像大小及放大圖像詳解_python
- 2023-07-06 springBoot JWT實現websocket的token登錄攔截認證
- 2022-04-24 .Net?Core讀取文件時中文亂碼問題的解決方法分享_實用技巧
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支