Qt 不规则窗口
项目工程目录:
mywidget.h:
#ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> namespace Ui { class MyWidget; } class MyWidget : public QWidget { Q_OBJECT public: explicit MyWidget(QWidget *parent = 0); ~MyWidget(); protected: void paintEvent(QPaintEvent *event);//重写绘图事件 void mouseMoveEvent(QMouseEvent *event);//重写鼠标移动事件 void mousePressEvent(QMouseEvent *event);//重写鼠标按下事件,目的是为了求取按下的坐标点 private: Ui::MyWidget *ui; QPoint p;//这里为了求取坐标添加一个点 }; #endif // MYWIDGET_H
mywidget.cpp:
#include "mywidget.h" #include "ui_mywidget.h" #include <QPainter> #include <QMouseEvent> MyWidget::MyWidget(QWidget *parent) : QWidget(parent), ui(new Ui::MyWidget) { ui->setupUi(this); //去窗口边框 setWindowFlags(Qt::FramelessWindowHint | windowFlags());//windowFlags()获取原来的标记,在原来的基础上添加了去边框Qt::FramelessWindowHint //将窗口背景颜色设置为透明 setAttribute(Qt::WA_TranslucentBackground); /* * 经过上面的设置,可以出现不规则的窗口,但是发现没有办法按照点击鼠标移动,所以这里就需要重写鼠标事件 */ } MyWidget::~MyWidget() { delete ui; } void MyWidget::paintEvent(QPaintEvent *event) { //这里仅仅是窗口添加图片 QPainter p(this); p.drawPixmap(0,0,QPixmap(":/res/2.png")); } void MyWidget::mouseMoveEvent(QMouseEvent *event) { if (event->buttons() & Qt::LeftButton) { move(event->globalPos() -p); } } void MyWidget::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::RightButton) { //关闭窗口 close(); } else if (event->button() == Qt::LeftButton) { //求坐标差值 //当前点击坐标 - 窗口左上角坐标 p = event->globalPos() - this->frameGeometry().topLeft(); } }