主要思路:
1:将窗体设为Qt::FramelessWindowHint(去掉标题栏)。
2:用一幅有部分区域是透明的图片作为程序的界面,并将图片透明的地方设为穿透。
1:将窗体设为Qt::FramelessWindowHint(去掉标题栏)。
2:用一幅有部分区域是透明的图片作为程序的界面,并将图片透明的地方设为穿透。
3:重载程序的鼠标事件。
源代码:
.h文件
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include <QMouseEvent>
#include <QPixmap>
#include <QPainter>
#include <QBitmap>
namespace Ui {
class myWidget;
}
class myWidget : public QWidget
{
Q_OBJECT
public:
explicit myWidget(QWidget *parent = 0);
~myWidget();
protected:
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void paintEvent(QPaintEvent *event);
void enterEvent(QEvent *event);
void leaveEvent(QEvent *event);
private:
Ui::myWidget *ui;
QPoint m_CurrentPos;
QPixmap m_Pixmap;
};
#endif // MYWIDGET_H
.cpp文件
#include "mywidget.h"
#include "ui_mywidget.h"
myWidget::myWidget(QWidget *parent) :
QWidget(parent,Qt::FramelessWindowHint),
ui(new Ui::myWidget)
{
ui->setupUi(this);
setWindowTitle("Irregular widget");
//加载一幅有部分区域是透明的图片作为程序的界面
m_Pixmap.load("F:/1.png");
resize( m_Pixmap.size() );
//不规则窗口的关键,将图片透明的地方设为穿透
setMask( m_Pixmap.mask() );
}
myWidget::~myWidget()
{
delete ui;
}
void myWidget::mousePressEvent(QMouseEvent *event)
{
//按住左键可以托动窗口,按下右键关闭程序
if(event->button() == Qt::LeftButton)
{
m_CurrentPos = event->globalPos() - frameGeometry().topLeft();
event->accept();
}
else if(event->button() == Qt::RightButton)
close();
}
void myWidget::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() && Qt::LeftButton)
{
move(event->globalPos() - m_CurrentPos);
event->accept();
}
}
void myWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.drawPixmap(0, 0, m_Pixmap);
}
void myWidget::leaveEvent(QEvent *event)
{
//鼠标离开窗口时是普通的指针
setCursor(Qt::ArrowCursor);
}
void myWidget::enterEvent(QEvent *event)
{
//鼠标留在窗口上时是一个手指
setCursor(Qt::PointingHandCursor);
}