Qt实现桌面悬浮球/不规则窗体

来源:互联网 发布:tpo mac 编辑:程序博客网 时间:2024/04/28 07:02

第一步:去掉窗口标题栏

构造函数

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
改为

Widget::Widget(QWidget *parent) :
    QWidget(parent, Qt::FramelessWindowHint),
    ui(new Ui::Widget)

第二步:窗体透明

(构造函数内添加)

this->setAttribute(Qt::WA_TranslucentBackground, true);

第三步:绘制显示窗体

需要包含

#include <QPixmap>

1,在界面里添加一个QLabel

2,创建一个QPixmap,并绘制要显示的窗口图形或者直接加载背景图片。

    QPixmap *pixw;
    pixw = new QPixmap(ui->label->size());
    pixw->fill(QColor(255,0,0,150));
    ui->label->setPixmap(*pixw);
3,QPixmap加载到label显示。


第四步:鼠标功能

需要包含

#include <QMouseEvent>
#include <QPoint>

1鼠标拖动

鼠标按下记录相对位置

void Widget::mousePressEvent(QMouseEvent *event)
{
    if(event->button()==Qt::LeftButton){
        relativePos = this->pos()- event->globalPos();
    }
}
鼠标移动,移动窗体

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    this->move(event->globalPos() + relativePos);
}


完整程序

widget.cpp

#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
    QWidget(parent, Qt::FramelessWindowHint),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->setAttribute(Qt::WA_TranslucentBackground, true);
    QPixmap *pixw;
    pixw = new QPixmap(ui->label->size());
    pixw->fill(QColor(255,0,0,150));
    ui->label->setPixmap(*pixw);
}
Widget::~Widget()
{
    delete ui;
}
void Widget::mousePressEvent(QMouseEvent *event)
{
    if(event->button()==Qt::LeftButton){//左键拖动窗体
        relativePos = this->pos()- event->globalPos();
    }
    if(event->button()==Qt::MidButton){//中键关闭窗体
        this->close();
    }
    if(event->button()==Qt::RightButton){//右键打开网址或文件
        QDesktopServices::openUrl(QUrl("file:///C:/windows", QUrl::TolerantMode));
      //  QDesktopServices::openUrl(QUrl("http://www.baidu.com"));
    }
}
void Widget::mouseMoveEvent(QMouseEvent *event)//移动窗体
{
    this->move(event->globalPos() + relativePos);
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QMouseEvent>
#include <QPoint>
#include <QPixmap>
#include <QDesktopServices>
#include <QUrl>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
    Q_OBJECT
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
private:
    Ui::Widget *ui;
    QPoint relativePos;
protected:
 //   void paintEvent(QPaintEvent*);
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
};
#endif // WIDGET_H


界面内添加一个label即可



1 0