1、效果

黑色这个控件是自定义的,可以在界面拖动

2、新建控件的Qt类,父类是QWidget,带ui的,Control.h

#ifndef CONTROL_H
#define CONTROL_H
#include <QWidget> namespace Ui {
class Control;
} class Control : public QWidget
{
Q_OBJECT public:
explicit Control(QWidget *parent = );
~Control();
int A1X,A1Y;
int A2X,A2Y;
int pressX,pressY;
int curentX,curentY;
protected:
void paintEvent(QPaintEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event); private:
Ui::Control *ui;
}; #endif // CONTROL_H

3、Control.cpp

#include "control.h"
#include "ui_control.h"
#include <QDebug>
#include <QMouseEvent>
Control::Control(QWidget *parent) :
QWidget(parent),
ui(new Ui::Control)
{
ui->setupUi(this);
A2X = this->pos().x();
A2Y = this->pos().y();
} Control::~Control()
{
delete ui;
} void Control::paintEvent(QPaintEvent *event)
{
#if 1
QPalette palette(this->palette());
palette.setColor(QPalette::Background, Qt::black);
this->setAutoFillBackground(true);
this->setPalette(palette);
#endif
if(A2X== && A2Y==)
{
return;
}
this->move(A2X,A2Y);
} void Control::mouseMoveEvent(QMouseEvent *event)
{
if (event->buttons() == Qt::LeftButton) // 这个if判断只是为了保证是按压鼠标左键移动产生窗体拖动效果
{
#if 0
curentX = event->x();//鼠标点相对当前widget的位置
curentY = event->y();
#endif
curentX = event->globalX();//鼠标点相对整个显示器的位置
curentY = event->globalY();
A2X = A1X+curentX-pressX;
A2Y = A1Y+curentY-pressY;
#if 0
qDebug()<< "mouseMoveEvent:" << curentX << curentY;
qDebug()<< "A2XY:" << A2X << A2Y;
#endif
update();
}
} void Control::mousePressEvent(QMouseEvent *event)
{
pressX = event->globalX();//鼠标点相对整个显示器的位置
pressY = event->globalY();
A1X = this->x();//widget左上角相对程序的位置
A1Y = this->y();
#if 0
int a = event->x();//鼠标点相对当前widget的位置
int b = event->y();
int c = this->geometry().x();//widget左上角相对程序的位置
int d = this->geometry().y();
qDebug()<< "mousePressEvent:" << pressX << pressY;
qDebug()<< "A1XY:" << A1X << A1Y;
qDebug()<< "A1xy:" << A1X << A1Y;
qDebug()<< "ab:" << a << b;
qDebug()<< "cd:" << c << d;
#endif
}

4、在main.ui里拖入widget控件,提升为Control,运行,ok

Qt坐标系以及自定义可移动控件的更多相关文章

  1. Qt:使用自定义的字体

    Qt:使用自定义的字体 1. 下载字体文件 2. 加载字体文件 3. 使用字体   QFontDatabase::addApplicationFont("XENOTRON.TTF" ...

  2. Qt信号之自定义数据类型

    [1]为什么需要自定义数据类型? 内置类型毕竟很有局限性,否则为什么还需要类呢.总之,有时候,我们多么希望信号能发送自定义数据类型. 幸哉~ Qt是支持自定义信号,且自定义信号可以发送自定义数据类型的 ...

  3. Qt之创建自定义类型

    摘要: 简述 当使用Qt创建用户界面时,特别是那些带有特殊控制和特征的界面时,开发者通常需要创建新数据类型来扩展或替换Qt现有的的值类型集合. 标准类型,比如:QSize.QColor和QString ...

  4. Qt之如何自定义model

    Qt之如何自定义model https://blog.csdn.net/wei375653972/article/details/86592209

  5. QT使用提升自定义组件

    QT使用提升自定义组件 QTC++QT自定义 QT 组件提升来实现自定义功能 介绍 我们在使用QT设置界面之后,往往需要自己实现一些方法,如果是单独 的还好,但是如果遇到很多同类型的都有需求, 比如 ...

  6. QT笔记之自定义窗口拖拽移动

    1.QT自定义标题栏,拖拽标题栏移动窗口(只能拖拽标题,其他位置无法拖拽) 方法一: 转载:http://blog.sina.com.cn/s/blog_4ba5b45e0102e83h.html . ...

  7. Qt之QHeaderView自定义排序(获取正确的QModelIndex)

    简述 前几节中分享过关于自定义排序的功能,貌似我们之前的内容已经可以很好地解决排序问题了,但是,会由此引发一些很难发现的问题...比如:获取QModelIndex索引错误. 下面,我们先来实现一个整行 ...

  8. Qt之QHeaderView自定义排序(终极版)

    简述 本节主要解决自定义排序衍生的第二个问题-将整形显示为字符串,而排序依然正常. 下面我们介绍三种方案: 委托绘制 用户数据 辅助列 很多人也许会有疑虑,平时都用delegate来绘制各种按钮.图标 ...

  9. Qt之QHeaderView自定义排序(QSortFilterProxyModel)

    简述 对以上节的排序,我们衍伸了两点: 把一个字符串前面的数据按照字符串比较,而后面的数据按照整形比较. 将整形显示为字符串,而排序依然正常呢. 为了分别描述,这里我们先解决问题1. 简述 效果 处理 ...

随机推荐

  1. java 从上至下打印二叉树

    从上往下打印二叉树题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, ...

  2. Return local beginning of day time object in Go

    Both the title and the text of the question asked for "a local [Chicago] beginning of today tim ...

  3. CH6201 走廊泼水节[最小生成树]

    描述 [简化版题意]给定一棵N个节点的树,要求增加若干条边,把这棵树扩充为完全图,并满足图的唯一最小生成树仍然是这棵树.求增加的边的权值总和最小是多少. 我们一共有N个OIER打算参加这个泼水节,同时 ...

  4. 1128 聚合查询 orm字段及属性

    目录 一 聚合查询 1. 级联 级联删除 级联更新 2. 聚合函数 使用 aggregate 使用场景 3. 分组查询 语法 使用 annotate 代码 4. F与Q查询 F查询 Q查询 二 ORM ...

  5. mysql - 引擎与锁的概念( 基础 )

    MySQL - 关系型数据库  - innodb : - 支持事务 事务的特征 : - 原子性:事务是最小单位,不可再分,事务执行的过程中,要么同时失败,要么同时成功,如,A跟B转账,一旦有一方出问题 ...

  6. 使用JSP/Servlet技术开发新闻发布系统---JSP数据交互(二)

    JSP内置对象application application对象 JSP常用的内置对象 对象的作用域 作用的分类 对象的作用域 page作用域 实例 //页面1 <% String name = ...

  7. 003_Python3 基本数据类型

    1.Python 中的变量不需要声明.每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存 ...

  8. java重载和重写

    重载(Overloading) (1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型. 重载Overloading是一个类中多态性的一种表现. ...

  9. 百度UEditor编辑器从word粘贴公式

    官网地址http://ueditor.baidu.com Git 地址 https://github.com/fex-team/ueditor 参考博客地址 http://blog.ncmem.com ...

  10. [luogu] zpl的数学题1

    https://www.luogu.org/problemnew/show/U16887 $f[1] + f[2] + f[3] + .... + f[n] = f[n + 2] - 1$ 矩阵快速幂 ...