Qt 不规则窗口

常见的窗体是各种方形的对话框,但有时候也需要非方形的窗体,如圆形,椭圆甚至是不规则形状的对话框。
实现步骤:
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



    }

}

发布了241 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ShenHang_/article/details/105004407