Qt总结(二)--悬浮窗

悬浮窗效果

指示灯GuideLight 窗体类,继承QMainWindow

#include <QMainWindow>
#include <QLabel>
#include <QMouseEvent>
#include <QPixmap>
#include <QBitmap>
class GuideLight : public QMainWindow
{
    Q_OBJECT

public:
    explicit GuideLight(QWidget *parent = 0);
    ~GuideLight();
    Light *lightLabel;
    void getScreenInfo();

private:
    Ui::GuideLight *ui;
};

(1)设置窗体属性:工具栏模式(隐藏任务栏图标)、隐藏标题栏、窗体置顶
(2)根据图片重设窗体大小,再设置遮罩,实现不规则窗体

GuideLight::GuideLight(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::GuideLight)
{
    ui->setupUi(this);
    //工具栏(隐藏任务栏图标)窗体置顶 隐藏标题栏
    setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);

    int width=100,height=100;
    //设置窗体遮罩
    QPixmap pix(":/image/image/light_blue.png");
    pix=pix.scaled(width, height, Qt::KeepAspectRatio, Qt::SmoothTransformation);
    resize(pix.size());
    setMask(QBitmap(pix.mask()));
    //getScreenInfo();
    
    lightLabel=new Light(this);
    lightLabel->setGeometry(0,0,width,height);
}

Light类继承QLabel, 用于显示图片,捕获鼠标事件实现窗体拖动

class Light : public QLabel
{
    Q_OBJECT

public:
    explicit Light(QWidget *);
    bool mousePressFlag;
    QPoint prePos;
    enum {L_RED,L_BLUE,L_YELLOW,L_GREEN};
    void changeColor(int);

private:

protected:
    void mousePressEvent(QMouseEvent * event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
signals:

private slots:

};

鼠标按下时记录当前鼠标坐标,拖动过程中鼠标位置减去原位置就是窗体的位移量

void Light::mousePressEvent(QMouseEvent *event)
{
    if(event->button()== Qt::LeftButton)
    {
        mousePressFlag=true;
        prePos=event->globalPos();
    }
}

void Light::mouseMoveEvent(QMouseEvent *event)
{
    if(mousePressFlag)
    {
        QPoint move_pos = event->globalPos()-prePos;
        window()->move(window()->pos()+move_pos);  //根据鼠标拖动移动位置
        prePos=event->globalPos();  //更新位置
    }
    event->ignore();
}
void Light::mouseReleaseEvent(QMouseEvent *event)
{
    if(event->button()== Qt::LeftButton)
        mousePressFlag=false;
}

调用changeColor函数就可以实现指示灯变色效果

void Light::changeColor(int color)
{
    if(L_BLUE == color)
        setStyleSheet("QLabel{border-image: url(:/image/image/light_blue.png)}");
    else if(L_RED == color)
        setStyleSheet("QLabel{border-image: url(:/image/image/light_red.png)}");
    else if(L_YELLOW == color)
        setStyleSheet("QLabel{border-image: url(:/image/image/light_yellow.png)}");
    else if(L_GREEN == color)
        setStyleSheet("QLabel{border-image: url(:/image/image/light_green.png)}");
}

生成悬浮窗

guidelight.hguidelight.cppguidelight.ui 三个文件添加到工程,在MainWindow类中声明

protected:
    GuideLight L_up,L_down,L_left,L_right;

接着调用L_up.setGeometry(910,0,100,100)L_up.show()可以显示悬浮窗
使用L_up.lightLabel->changeColor(Light::L_RED)可以实现指示灯变色效果

获取屏幕属性

设置悬浮窗位置希望设置在屏幕的左下角和右下角,所以需要知道屏幕的分辨率
//获取屏幕大小等信息,便于设置窗体位置
(1)virtualWidth 、virtualHeight 是虚拟屏幕的大小,存在多块屏幕时,把这些屏幕看做一块整体的虚拟屏幕。
(2)availableWidth 、availableHeight 实际可以使用的屏幕范围,如任务栏占用的那部分就不能使用,要减去
(3)screenWidth、screenHeight 屏幕的分辨率
在这里插入图片描述
ubuntu 下,多了顶部状态栏
在这里插入图片描述

void GuideLight::getScreenInfo()
{
    int virtualWidth = 0;
    int virtualHeight = 0;
    int availableWidth = 0;
    int availableHeight = 0;
    int screenWidth = 0;
    int screenHeight = 0;

    QDesktopWidget *deskWgt = QApplication::desktop();
    if (deskWgt) {
        virtualWidth = deskWgt->width();
        virtualHeight = deskWgt->height();
        std::cout << "virtual width:" << virtualWidth << ",height:" << virtualHeight << std::endl;

        QRect availableRect = deskWgt->availableGeometry();
        availableWidth = availableRect.width();
        availableHeight = availableRect.height();
        std::cout << "available width:" <<availableWidth << ",height:" << availableHeight << std::endl;

        QRect screenRect = deskWgt->screenGeometry();
        screenWidth = screenRect.width();
        screenHeight = screenRect.height();
        std::cout << "screen width:" <<screenWidth << ",height:" << screenHeight << std::endl;
    }
}

设置窗体遮罩

(1)图片遮罩。使用一张png格式的图片作为遮罩可以实现不规则窗体

int width=100,height=100;
//设置窗体遮罩
QPixmap pix(":/image/image/light_blue.png");
pix=pix.scaled(width, height, Qt::KeepAspectRatio, Qt::SmoothTransformation);
resize(pix.size());
setMask(QBitmap(pix.mask()));

(2)矩形遮罩

setMask(QRegion(0,0,110,110));

加环形进度条

https://www.cnblogs.com/feiyangqingyun/p/10801377.html

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值