![](https://i-blog.csdnimg.cn/blog_migrate/96c8a8aa26c048c320bbbac594d370a4.png)
悬浮窗效果
指示灯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.h
、guidelight.cpp
、guidelight.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