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> //鼠标事件
现在, 我们的窗口就可以单击移动了! 另外需要的话要自己加个退出键哦
下面分析下关于坐标差值和窗口定位的问题:
好了! 感谢各位的阅读, 希望我的文章对您有帮助.