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-> ...
随机推荐
- Android 利用Service实现下载网络图片至sdk卡
package com.example.myapp5; import android.app.Activity; import android.content.Intent; import andro ...
- Ubuntu + CentOS7 搭建tftp Server
基于Ubuntu系统做的tftp服务器,基于CentOS 7都差不多,书写了关键命令,测试过Ubuntu 12.0.4 和CentOS 7环境 1.介绍tftp服务器 TFTP(Trivial ...
- (顺序表的应用5.4.2)POJ 1591 M*A*S*H(约瑟夫环问题的变形——变换步长值)
/* * POJ_1591_2.cpp * * Created on: 2013年10月31日 * Author: Administrator */ #include <iostream> ...
- web跨页弹窗选值
最近在项目中看到这样一种效果——点击当前网页文本框,然后弹出一个缩小的网页,并在网页里选择或填写数据,然后又返回当前网页,小网页关闭.感觉非常不错,其实在以前网上也看见过,只是当时没有留心.今天抽时间 ...
- linux设备驱动归纳总结(五):1.在内核空间分配内存【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-79134.html linux设备驱动归纳总结(五):1.在内核空间分配内存 xxxxxxxxxxxx ...
- 161031、java.util.StringTokenizer使用及源码
import java.util.StringTokenizer; public class TestStringTokenizer { public static void main(String[ ...
- 161021、spring异步调用,完美解决!
前言 项目中,用户抢单,下单需要向对方推送消息,但是加上推送就会造成抢单和下单性能降低,反应变慢,因为抢单下单动作跟推送部分是同步的,现在想改成异步推送. 在Java应用中,绝大多数情况下都是通过同步 ...
- linux下共享内存mmap和DMA(直接访问内存)的使用 【转】
转自:http://blog.chinaunix.net/uid-7374279-id-4413316.html 介绍Linux内存管理和内存映射的奥秘.同时讲述设备驱动程序是如何使用“直接内存访问” ...
- PBOC APDU命令解析【转】
转自:http://blog.csdn.net/zuokong/article/details/49335257 版权声明:本文为博主原创文章,未经博主允许不得转载. 应用层发出的命令报文和卡片回送到 ...
- Linux CentOS 6.5 yum安装MongoDB的操作
安装MongoDB的方法有很多种,可以源代码安装,在CentOS也可以用yum源安装的方法.由于MongoDB更新得比较快,我比较喜欢用yum源安装的方法.64位CentOS下的安装步骤如下: 1.准 ...