撩妹弹窗之qt实现

说明

idea来源:https://djyqxbc-python.blog.csdn.net/article/details/117931360

周末没事查看到了上面链接帖子,发现创意挺好的,但是使用非qt方式实现!晚上睡觉的时候就琢磨着要不要自己用qt也做一个,第二天懒觉都抛弃了,上午写代码,中午把本文写出来,然后去吃个香喷喷米饭。
实现效果:
在这里插入图片描述
推荐文章:

设计思路

众所周知,qt中控件的位置是可以设置为负数的!本文就是利用到这一点,将背景图位置设置大小与桌面分辨率相等,设置位置相对桌面静止即可。

1、如何实现呢?

图片位置 = - 主界面 的桌面位置

2、位置设置代码实现:

ui->label->move(-this->pos());       //设置lab位置

3、每次鼠标按下移动后,重写移动事件,获取mainwindow位置,然后对mainwindow中图片的位置进行设置。
至于实现拖动主界面,可以参考文章:https://blog.csdn.net/weixin_42887343/article/details/114384324

4、其他功能:

  1. 归位功能,按下空格键,窗口回到屏幕中心位置。
  2. 按键移动功能,按上下左右箭头移动。
  3. 按 esc键退出软件。
  4. 双击窗口,实现随机移动查看(目前还未实现

实现

mainwindow.h文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMouseEvent>
#include <QLabel>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    void mousePressEvent(QMouseEvent *event);
    void mouseDoubleClickEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void keyPressEvent(QKeyEvent *event);

private:
    Ui::MainWindow *ui;
    QLabel *mLab;
    QRect deskRect;
    QPoint startMousPos;    //按下时鼠标位置(相对桌面)
    QPoint startWinPos;    //按下时主界面位置(相对桌面)
    void moveWin(QPoint movePos);
};

#endif // MAINWINDOW_H

mainwindow.cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QScreen>
#include <QDebug>
#include <QTimer>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowFlags(Qt::FramelessWindowHint);
    mLab = new QLabel("",this);
    QScreen *screen = QGuiApplication::primaryScreen ();
    deskRect = screen->availableGeometry();
    mLab->resize(deskRect.size());       //设置背景lab大小,lab用于放背景图片的
    QImage scaledimg;
    scaledimg.load(QString(QApplication::applicationDirPath() + "/backImg.png"));        //导入图片
    scaledimg = scaledimg.scaled(mLab->width(),mLab->height(),Qt::KeepAspectRatio);
    mLab->setPixmap(QPixmap::fromImage(scaledimg));

    //主界面的构造函数中,窗口还未真正创建,主界面的位置还是初始化值:0,0
    //100ms后构造结束了,再设置label位置。
    QTimer::singleShot(100,this,[=](){
        mLab->move(-this->pos());
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::moveWin(QPoint movePos)
{
    this->move(this->pos() + movePos );  //设置主界面位置
    mLab->move(-this->pos());       //设置lab位置
}

void MainWindow::mouseDoubleClickEvent(QMouseEvent *event)  //双击鼠标实现随机移动查看方式,使用定时器驱动
{
    //this->close();
}

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    startMousPos = event->globalPos();  //鼠标位置
    startWinPos = this->pos();          //窗口位置
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    if(event->buttons() & Qt::LeftButton)//判断是否是左键按下
    {
        QPoint movePos = event->globalPos() - startMousPos;//计算鼠标移动位置
        if(movePos.manhattanLength() > 4)//判断移动像素距离,防抖动
        {
            this->move(startWinPos + movePos);  //设置主界面位置
            mLab->move(-this->pos());
            //qDebug()<<"label pos:"<<mLab->pos();
        }
        return;
    }
}

void MainWindow::keyPressEvent(QKeyEvent *event)
{
    int upDown = 0,leftRight = 0;   //山下左右移动矢量
    int moveSensitive = 8;          //移动灵敏度
    if(event->key() == Qt::Key_Escape)  //按 “esc” 键推出
        this->close();
    if(event->key() == Qt::Key_Space)  //按 “空格 space” 键归桌面中心位置
    {
        QScreen *screen = QGuiApplication::primaryScreen ();
        QRect screenRect = screen->availableGeometry();
        int posX = (screenRect.width() - this->width())/2;
        int posY = (screenRect.height() - this->height())/2;
        QPoint movePos = QPoint(posX,posY) - this->pos();
        leftRight = movePos.x();
        upDown = movePos.y();
    }
    else if(event->key() == Qt::Key_Up)     //上
    {
        upDown -= moveSensitive;
    }
    else if(event->key() == Qt::Key_Down)   //下
    {
        upDown += moveSensitive;
    }
    else if(event->key() == Qt::Key_Left)   //左
    {
        leftRight  -= moveSensitive;
    }
    else if(event->key() == Qt::Key_Right)  //右
    {
        leftRight  += moveSensitive;
    }
    moveWin(QPoint(leftRight,upDown));
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值