常见的窗体是各种方形的对话框,但有时候也需要非方形的窗体,如圆形,椭圆甚至是不规则形状的对话框。
实现步骤:
1.新建一个项目,比如项目名称叫做“irregularWindow”,给此项目添加一个类“MyWidget”,基类选择“QWidget”;
2.为了使该不规则窗体可以通过鼠标随意拖拽,在类中重定义鼠标事件:mousePressEvent()、mouseMoveEvent()、以及绘制函数paintEvent();
3. MyWidget的构造函数部分是实现该不规则窗体的关键,添加具体代码如下:
mywidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class MyWidget; }
QT_END_NAMESPACE
class MyWidget : public QWidget
{
Q_OBJECT
public:
MyWidget(QWidget *parent = nullptr);
~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);
//去当前窗口边框
this->setWindowFlags(Qt::FramelessWindowHint|this->windowFlags());//在原来的基础上去边框,所有用到“或”
//把窗口背景设置为透明
this->setAttribute(Qt::WA_TranslucentBackground);
}
MyWidget::~MyWidget()
{
delete ui;
}
void MyWidget::paintEvent(QPaintEvent *event)
{
QPainter p(this);
p.drawPixmap(0,0,QPixmap(":/new/prefix1/image/sunny.png"));
}
void MyWidget::mouseMoveEvent(QMouseEvent *e)
{
if(e->buttons()&Qt::LeftButton)
{
this->move(e->globalPos()-p);
}
}
void MyWidget::mousePressEvent(QMouseEvent *e)
{
if(e->button()==Qt::RightButton)
{
close();
}
else if(e->button()==Qt::LeftButton)
{
//求相对坐标
//当前点击坐标-窗口左上角坐标(矩形区域左上角的坐标)
p=e->globalPos()-this->frameGeometry().topLeft();//frameGeometry()的说明:geometry of the widget relative to its parent including any window frame
}
}