1.新建Gui應用,類名自定義(示例爲ShapeWidget),基類選擇QWidget
2.爲了使不規則窗體能夠通過鼠標隨意拖拽,在類中重定義了鼠標事件 mousePressEvent() 、mouseMoveEvent() 以及繪製函數paintEvent()
protected:
void mousePressEvent(QMouseEvent *);
void mouseMoveEvent(QMouseEvent *);
void paintEvent(QPaintEvent *);
3.在.cpp中,添加如下代碼
QPixmap pix;
pix.load("16.png", 0, Qt::AvoidDither | Qt::ThresholdDither | Qt::ThresholdAlphaDither);
resize(pix.size());
setMask(QBitmap(pix.mask()));
先新建一個QPixmap對象,
再調用 QPixmap 的 load() 函數爲QPixmap填入圖像值,
接着調用 resize() 重設窗體尺寸爲所讀圖片大小
最後調用 setMask() 爲調用它的空間增加一個遮罩,遮住所選區域以外的部分,使之看起來透明。此處調用QPixmap的 mask() 函數獲取圖片自身的遮罩,爲一個QBitMap對象,然後用 setMask() 將這部分進行透明遮罩。
4.實現 mousePressEvent() 、mouseMoveEvent() 以及繪製函數 paintEvent()
關於mousePressEvent() 、mouseMoveEvent() 就不多說了,之前的文章裏實現過了,這裏主要看一下 paintEvent() ,
重畫函數 paintEvent() 主要完成在窗體上繪製圖片的工作,之前的步驟創建了一個基於某個png圖片的不規則窗體,這裏就是將該png圖片繪製進窗體
void ShapeWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.drawPixmap(0, 0, QPixmap("16.png"));
}
效果如圖
完整代碼如下
.h
#pragma once
#include <QWidget>
#include "ui_ShapeWidget.h"
class ShapeWidget : public QWidget
{
Q_OBJECT
public:
ShapeWidget(QWidget *parent = Q_NULLPTR);
~ShapeWidget();
protected:
void mousePressEvent(QMouseEvent *);
void mouseMoveEvent(QMouseEvent *);
void paintEvent(QPaintEvent *);
private:
Ui::ShapeWidget ui;
QPoint dragPosition;
};
.cpp
#include "ShapeWidget.h"
#include <QMouseEvent>
#include <QPainter>
#include <QPixmap>
#include <QBitmap>
ShapeWidget::ShapeWidget(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
QPixmap pix;
pix.load("16.png", 0, Qt::AvoidDither | Qt::ThresholdDither | Qt::ThresholdAlphaDither);
resize(pix.size());
setMask(QBitmap(pix.mask()));
}
ShapeWidget::~ShapeWidget()
{
}
void ShapeWidget::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
dragPosition = event->globalPos() - frameGeometry().topLeft();
event->accept();
}
if (event->button() == Qt::RightButton)
{
//close();
}
}
void ShapeWidget::mouseMoveEvent(QMouseEvent *event)
{
//if (event->buttons()&Qt::LeftButton)
if (event->buttons() == Qt::LeftButton)
{
move(event->globalPos() - dragPosition);
event->accept();
}
}
void ShapeWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.drawPixmap(0, 0, QPixmap("16.png"));
}