Qt在隐藏边框模式下怎么移动窗口?

Qt在隐藏边框模式下怎么移动窗口?

// 首先在窗口头文件中重载 paintEvent
protected:
    void paintEvent(QPaintEvent *event);

// 在 .cpp 文件中
// 重载 painterEvent
void Widget::paintEvent(QPaintEvent *event){
    
    // 创建画笔, 并指定到窗口
    QPainter p(this);
    // 载入图片
    QImage image;
    image.load("../Image/tofu.png");	//自己指定图片路径 ../为上一级目录
	// 画出图片
    p.drawImage(0, 0, image);
}

现在的效果:

在这里插入图片描述

接下来我们把边框隐藏, 并将背景设置为透明

// 在窗口的构造函数中

// 将边框去除 windowFlags() 是把原先有的属性也添加上
setWindowFlags(Qt::FramelessWindowHint | windowFlags());

// 将窗口背景设置为透明
setAttribute(Qt::WA_TranslucentBackground);

现在的效果:
在这里插入图片描述

这样我们发现我们没法移动窗口对吧, 下面我们来处理这个移动问题
我们用 鼠标单击 来实现移动

分析: 需要重载鼠标单击鼠标移动事件

// 还是在窗口头文件中重载 mousePressEvent 和 mouseMoveEvent
protected:	//放在和上次一样的属性里面就可以的
    void mouseMoveEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);

// 还需要添加一个私有变量, 用于保存坐标差值
private:
    QPoint coordinate;

// 在 .cpp 文件中

// 鼠标左键触发
void Widget::mousePressEvent(QMouseEvent *event){

    // 判断鼠标左键
    if(event->button() == Qt::LeftButton){

        // 求坐标差值, 具体分析放后面
        coordinate = event->globalPos() - this->frameGeometry().topLeft();
    }

}

// 鼠标移动触发
void Widget::mouseMoveEvent(QMouseEvent *event){
    
    // 判断左键(Qt::LeftButton)是否被按下, 只有按下了才返回1(true)
    if(event->buttons() & Qt::LeftButton){
        
        // 移动窗口
        move(event->globalPos() - coordinate);

    }

}
// 怕有人不清楚, 我们在 .cpp 中要记得加头文件
#include <QPainter>		//画笔
#include <QImage>		//图片加载
#include <QMouseEvent>	//鼠标事件

现在, 我们的窗口就可以单击移动了! 另外需要的话要自己加个退出键哦

下面分析下关于坐标差值窗口定位的问题:
在这里插入图片描述

好了! 感谢各位的阅读, 希望我的文章对您有帮助.

原创文章 6 获赞 5 访问量 149

猜你喜欢

转载自blog.csdn.net/qq_36394394/article/details/105898617
今日推荐