QT笔记之自定义窗口拖拽移动
1.QT自定义标题栏,拖拽标题栏移动窗口(只能拖拽标题,其他位置无法拖拽)
方法一:
转载:http://blog.sina.com.cn/s/blog_4ba5b45e0102e83h.html
.h文件中
//自己重新实现拖动操作
protected: void mouseMoveEvent ( QMouseEvent * event ); void mousePressEvent ( QMouseEvent * event ); void mouseReleaseEvent(QMouseEvent *); private:
//自己重新实现拖动操作
QPoint mousePosition;
bool isMousePressed;
.cpp文件中
//标题栏的长度
const static int pos_min_x = ;
const static int pos_max_x = -;
const static int pos_min_y = ;
const static int pos_max_y = ;
//自己实现的窗口拖动操作
void MainWindow::mousePressEvent(QMouseEvent *event)
{
mousePosition = event->pos();
//只对标题栏范围内的鼠标事件进行处理
if (mousePosition.x()<=pos_min_x)
return;
if ( mousePosition.x()>=pos_max_x)
return;
if (mousePosition.y()<=pos_min_y )
return;
if (mousePosition.y()>=pos_max_y)
return;
isMousePressed = true;
}
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
if ( isMousePressed==true )
{
QPoint movePot = event->globalPos() - mousePosition;
move(movePot);
}
}
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
isMousePressed=false;
}
方法二:(可以拖拽窗口任意位置)
转载:http://blog.sina.com.cn/s/blog_a6fb6cc90101au8r.html
自定义界面步骤:
1.设置标题栏隐藏
//设置标题栏隐藏并设置位于顶层
setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
//可获取鼠标跟踪效果
setMouseTracking(true);
//注意:Qt::WindowStaysOnTopHint这个很重要,如果没有这句话即使是自定义界面成功了,界面可以拖动,但也还存在问题,那就是界面能够拖动到任务栏之下!
、 声明变量与鼠标事件
QPoint move_point; //移动的距离
bool mouse_press; //鼠标按下
//鼠标按下事件
void mousePressEvent(QMouseEvent *event);
//鼠标释放事件
void mouseReleaseEvent(QMouseEvent *event);
//鼠标移动事件
void mouseMoveEvent(QMouseEvent *event);
、定义鼠标事件
void LoginDialog::mousePressEvent(QMouseEvent *event)
{
if(event->button() == Qt::LeftButton)
{
mouse_press = true;
//鼠标相对于窗体的位置(或者使用event->globalPos() - this->pos())
move_point = event->pos();;
}
}
void LoginDialog::mouseMoveEvent(QMouseEvent *event)
{
//若鼠标左键被按下
if(mouse_press)
{
//鼠标相对于屏幕的位置
QPoint move_pos = event->globalPos(); //移动主窗体位置
this->move(move_pos - move_point);
}
}
void LoginDialog::mouseReleaseEvent(QMouseEvent *event)
{
//设置鼠标为未被按下
mouse_press = false;
}
方法三:
拖拽自定义窗口任意位置移动
转载:http://twyok.blog.163.com/blog/static/81229303201321545850433/
.h文件中
protected: void mousePressEvent(QMouseEvent *)
void mouseMoveEvent(QMouseEvent* ); private: QPoint last;//保存鼠标按下的位置
.cpp文件中
第一种写法
void xxxDialog::mousePressEvent(QMouseEvent *e)
{
last = e->globalPos();
} void xxxDialog::mouseMoveEvent(QMouseEvent *e)
{
if(e->buttons()== Qt::LeftButton)
{
QPoint newpos = e->globalPos();
QPoint upleft = mapToParent(newpos - last); //计算距原位置的偏移
move(upleft);
last = newpos; //更新原位置到最新的位置
}
}
这时已经可以用鼠标手动窗口到任意位置。
第二种写法:
void QxxxDlg::mousePressEvent(QMouseEvent *e)
{
if (e->button() == Qt::RightButton)
{
//右键关闭窗口
close();
} else if (e->button() == Qt::LeftButton)
{
//求坐标差,当前鼠标坐标 - 窗口左上角坐标
//frameGeometry返回窗口的矩形坐标, topLeft返回窗口左上角点的坐标
//move_point = e->globalPos() - this->frameGeometry().topLeft();
move_point = e->globalPos() - this->pos();
}
} void QxxxDlg::mouseMoveEvent(QMouseEvent *e)
{
if (e->buttons() & Qt::LeftButton)
{
move(e->globalPos()-move_point);
}
}
QT笔记之自定义窗口拖拽移动的更多相关文章
- QT 窗口拖拽移动实现
我们知道,要实现窗口移动可以直接鼠标点住窗口的标题栏实现拖拽移动,这是窗口默认的行为,在QT中的事件响应函数为moveEvent. 但是现实中经常需要鼠标点住窗口客户区域实现窗口的拖拽移动,代码实现如 ...
- iPhone手机解锁效果&&自定义滚动条&&拖拽--Clone&&窗口拖拽(改变大小/最小化/最大化/还原/关闭)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- electron-vue 窗口拖拽及自定义边框,及关闭缩小放大化方法
1.窗口的最小化按钮和关闭按钮以及标题栏自定义,不使用 electron 自身携带的原生标题栏 在src文件夹下main下index.js文件添加 mainWindow = new BrowserWi ...
- Qt之QAbstractItemView视图项拖拽(二)
一.需求说明 上一篇文章Qt之QAbstractItemView视图项拖拽(一)讲述了实现QAbstractItemView视图项拖拽的一种方式,是基于QDrag实现的,这个类是qt自己封装好了的,所 ...
- Qt之QAbstractItemView视图项拖拽(一)
一.需求说明 最近在搞视图项的拖拽,也上网查了一些资料,好多的文档都是一样的,只是被不通的网站所收录了(也有可能是被爬过去的,不明所以),不过也有一些文档写的不错,不过就是太简易,都是点睛之笔,总之功 ...
- nw.js FrameLess Window下的窗口拖拽与窗口大小控制
nw.js FrameLess Window下的窗口拖拽与窗口大小控制 很多时候,我们觉得系统的Frame框很难看,于是想自定义. 自定义Frame的第一步是在package.config文件中将fr ...
- JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)
转自<JS实现漂亮的窗口拖拽效果(可改变大小.最大化.最小化.关闭)>:http://www.jb51.net/article/73157.htm 这篇文章主要介绍了JS实现漂亮的窗口 ...
- Unity3D UGUI窗口拖拽
在开发UGUI时 我们时常需要做一个窗口拖拽的功能 先上代码 using UnityEngine; using UnityEngine.EventSystems; public class DragW ...
- QT窗口拖拽功能简单应用(处理dragEnterEvent和dropEvent事件,不同的事件有不同的信息,比如mimeData)
void dragEnterEvent(QDragEnterEvent *event); void dropEvent(QDropEvent *event); ui->lineEdit-> ...
随机推荐
- hdu5322 Hope
设dp[n]为n个数字排列时候的答案,那么可以得到dp方程 dp[n]=Σdp[n-i]*c(n-1,i-1)*(i-1)!*i^2(1<=i<=n) 然后上式可以化成卷积形式,分治FFT ...
- 。。。Ajax的回调函数function(data)中,data的返回类型。。。
今天在做项目的过程中,突然发现了一个有趣的问题,那就是我在Java服务器端写程序,String result = "0";然后通过out.println(result),将resu ...
- webpack.config.js
var webpack = require('webpack'); module.exports = { //插件项 plugins: [ new webpack.optimize.CommonsCh ...
- 夺命雷公狗—angularjs—12—get参数的接收
我们在实际的开发中get和post的交互都是离不开的,我们先来研究下get参数是如何接收到的.. 而且在实际开发中利用json来进行传递参数也是比较多的,这里我们就以get来接收参数为列.. 先创建一 ...
- full_case & parallel_case
case中的full_case与parallel_case讨论: 1)术语介绍: 整个case模块叫做:case_statement,注释部分叫做case_statement_header case ...
- PAT乙级 1027. 打印沙漏(20)
1027. 打印沙漏(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求你写个程序把给定的符号打印成 ...
- [sinatra] Sinatra再入门
原文URL:http://www.rubycc.com/bbs/topic_detail/86 1.基础代码app.rb require 'rubygems' require 'sinatra/bas ...
- Java ActiveMQ 讲解(一)理解JMS 和 ActiveMQ基本使用(转)
转自:http://www.cnblogs.com/luochengqiuse/p/4678020.html?utm_source=tuicool&utm_medium=referral 最近 ...
- [转]bit与byte
本文为转载,感谢博主的分享.原文地址:http://www.cnblogs.com/flyme/archive/2011/08/25/2153596.html bit意为“位”或“比特”,是计算机运算 ...
- java中length,length(),size()的区别
1. java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了length这个属性.2. java中的length()方法是针对字符串String说的,如果想看 ...