说明
idea来源:https://djyqxbc-python.blog.csdn.net/article/details/117931360
周末没事查看到了上面链接帖子,发现创意挺好的,但是使用非qt方式实现!晚上睡觉的时候就琢磨着要不要自己用qt也做一个,第二天懒觉都抛弃了,上午写代码,中午把本文写出来,然后去吃个香喷喷米饭。
实现效果:
推荐文章:
- qt电池控件设计:https://blog.csdn.net/weixin_42887343/article/details/113932145
- QWidget控件拖动:https://blog.csdn.net/weixin_42887343/article/details/114384324
- QWidget控件旋转方法:https://blog.csdn.net/weixin_42887343/article/details/115037420
- qt淡化提示框设计:https://blog.csdn.net/weixin_42887343/article/details/109303972
- qt之led(点阵)控件类设计:https://blog.csdn.net/weixin_42887343/article/details/115348953
- 加载动画控件类设计:https://blog.csdn.net/weixin_42887343/article/details/118541411
- 环形进度条控件设计:https://blog.csdn.net/weixin_42887343/article/details/120222293
设计思路
众所周知,qt中控件的位置是可以设置为负数的!本文就是利用到这一点,将背景图位置设置大小与桌面分辨率相等,设置位置相对桌面静止即可。
1、如何实现呢?
图片位置 = - 主界面 的桌面位置
2、位置设置代码实现:
ui->label->move(-this->pos()); //设置lab位置
3、每次鼠标按下移动后,重写移动事件,获取mainwindow位置,然后对mainwindow中图片的位置进行设置。
至于实现拖动主界面,可以参考文章:https://blog.csdn.net/weixin_42887343/article/details/114384324
4、其他功能:
- 归位功能,按下空格键,窗口回到屏幕中心位置。
- 按键移动功能,按上下左右箭头移动。
- 按 esc键退出软件。
- 双击窗口,实现随机移动查看(目前还未实现)
实现
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));
}