QT实现可拖动自定义控件
使用QT实现自定义类卡牌控件Card,使其能在父类窗口上使用鼠标进行拖动。

控件类头文件card.h
#ifndef CARD_H
#define CARD_H #include <QWidget>
#include <QPaintEvent>
#include <QPainter>
#include <QMouseEvent> class Card:public QWidget
{
Q_OBJECT
public:
explicit Card(QWidget *parent = nullptr);
~Card();
protected:
void paintEvent(QPaintEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
signals:
void sendSelf(Card *w);
}; #endif // CARD_H
控件类头文件card.cpp
#include "card.h" Card::Card(QWidget *parent):QWidget(parent)
{
this->setGeometry(0,0,200,400); //设置控件窗口大小
} Card::~Card()
{ } void Card::paintEvent(QPaintEvent *event)
{
QPainter painter(this); //创建画笔
painter.setRenderHint(QPainter::Antialiasing,true);
QBrush brush; //创建笔刷
brush.setColor(Qt::yellow); //设置笔刷颜色
brush.setStyle(Qt::SolidPattern);
painter.setBrush(brush); //设置画笔笔刷
painter.drawRoundedRect(QRectF(5,5,190,390),10,10); //绘制圆角矩形并填充
} void Card::mousePressEvent(QMouseEvent *event)
{
Q_UNUSED(event);
emit sendSelf(this); //信号发送该控件地址
}
以上是基于widget类的控件类;
父窗口头文件mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H #include <QMainWindow>
#include "card.h"
#include <QDebug> namespace Ui {
class MainWindow;
} class MainWindow : public QMainWindow
{
Q_OBJECT public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow(); private:
Ui::MainWindow *ui;
Card* cd[8];
Card *temp;
QPoint startP;
QPoint yuanP; private slots:
void getObject(Card *w); protected:
void mouseMoveEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
}; #endif // MAINWINDOW_H
父窗口头文件mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
for(int i=0;i<8;i++)
{
cd[i] = new Card(this);
connect(cd[i],&Card::sendSelf,this,&MainWindow::getObject);
cd[i]->move(i%4*200,i/4*400+20);
}
} MainWindow::~MainWindow()
{
delete ui;
} //获取控件坐标
void MainWindow::getObject(Card *w)
{
temp = w;
startP = cursor().pos()-this->pos();
yuanP = temp->pos();
/*将此小部件提升到父小部件堆栈的顶部*/
temp->raise();
} //移动事件
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
temp->move(yuanP.x()+event->x()-startP.x(),yuanP.y()+event->y()-startP.y());
} //拖拽对象置顶,卡牌积压的时候,拖动的那张卡牌置顶
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
temp->raise();
}
以下是工程源码:
链接:https://pan.baidu.com/s/1YH95FzZV7_idanob2qeHig
提取码:wbsy
QT实现可拖动自定义控件的更多相关文章
- Qt编写可拖动对象+背景地图+多种样式+多种状态(开源)
在很多项目应用中,需要根据数据动态生成对象显示在地图上,比如地图标注,同时还需要可拖动对象到指定位置显示,能有多种状态指示,为此特意编写本控件,全部开源出来,欢迎大家提建议.同时多多支持整套自定义控件 ...
- Qt编写自定义控件插件路过的坑及注意事项
在一日一控件的口号下,终于写好了五十几个自定义控件,包括各种仪表盘,各种温度计,各种进度条,各种按钮等,具体可参见(http://www.cnblogs.com/feiyangqingyun/p/61 ...
- 把自定义控件集成到Qt Designer中
要想在Qt Designer中使用自定义控件,必须要使Qt Designer能够知道我们的自定义控件的存在.有两种方法可以把新自定义控件的信息通知给Qt Designer:“升级(promotion) ...
- 编写Qt Designer自定义控件
一)流程概述 在使用Qt Designer设计窗体界面时,我们可以使用Widget Box里的窗体控件非常方便的绘制界面,比如拖进去一个按钮,一个文本编辑器等.虽然Qt Designer里的控件可以满 ...
- Qt编写的开源帖子集合(懒人专用)
回顾自己学习Qt以来九年了,在这九年多时间里面,从本论坛学习不到不少的东西,今天特意整了一下自己开源过的资源的帖子,整理一起方便大家直接跳转下载,不统计不知道,一统计吓一跳,不知不觉开源了这么多代码, ...
- web自定义控件UserControl
今天做了两个自定义控件,之前用WPF也做过,但是感觉跟今天的不太一样.首先是在项目中建了一个UserContral的控件界面,把需要的控件拖到里面,再给按钮添加事件.我们公司的控件都是买的Dev Ex ...
- 自定义的插件如何加载到Qt Designer中(详细)
要想在Qt Designer中使用自定义控件,必须要使Qt Designer能够知道我们的自定义控件的存在.有两种方法可以把新自定义控件的信息通知给Qt Designer:“升级(promotion) ...
- windows下安装QT并与visual studio 2017搭建开发环境
1.环境搭建 这里并不是说qt必须要和visual studio结合使用,不过用习惯了visual studio开发,继续使用可节省开发时间,并大大提供便利性. 关于安装过程这里不再详细赘述,软件下载 ...
- Qt自定义窗口部件
QtDesigner自定义窗口部件有两种方法:改进法(promotion)和插件法(plugin) 改进法 1.改进法之前,要先写好子类化QSpinBox后的HexspinBox.h和Hexs ...
- ASP.Net TextBox控件只允许输入数字
原文:ASP.Net TextBox控件只允许输入数字 1.1.在Asp.Net TextBox 控件的 OnKeyPress 事件中指定输入键盘码必须为数字: <asp:TextBox ID= ...
随机推荐
- Treewidget节点的删除
父节点的删除 // 第一种 // 树状列表父节点的删除 // 有点莽 不支持这种操作 delete ui->treeWidget->topLevelItem(0); // 第二种 QTr ...
- python 函数默认值误区
当创建python函数时,默认值参数实在执行def语句的时候创建的也即是在创建该函数的时候,而不是在调用该函数的时候创建的. def append(x, lst = []): lst.append(x ...
- 网易-java线程的interrupt
java线程的interrupt方法初一接触的时候,会和过去各种面向过程语言线程中断线程的方法有点不一样. java里不提倡直接将线程kill掉,实际上如果想直接kill线程可以用stop方法 可以看 ...
- 2020.3.9 ~ 2020.3.15 ACM训练周总结
一.本周ACM学习相关内容 学习了dfs和bfs -- 4小时 课上系统的学习了vector等stl函数的使用即注意事项-3小时 二.题数与耗时 师哥安排了12道题,做了五道(不包含比赛题):大概4个 ...
- c# iis网站发布
c# iis网站发布 问题一: 有很多人在用服务器发布网站的时候,一直出现 "HTTP 错误 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容",那么 ...
- Docker部署Nginx报错 WARNING: IPv4 forwarding is disabled. Networking will not work.
Docker 部署 Nginx 报错 WARNING: IPv4 forwarding is disabled. Networking will not work. [root@localhost ~ ...
- Docker 环境规划 (Docker安装)
一.环境规划 支持Java.dotNet.Vue项目构建 二.切换系统镜像源 1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.rep ...
- Java简单认识及环境下载
Java的特性和优势 简单性 面向对象 可移植性 跨平台性 write once run anywhere 高性能 分布式 动态性 反射 多线程 安全性 健壮性 Java三大版本 JavaSE:标准版 ...
- Nginx常用经典配置|反向代理、HTTPS重定向、端口转发
二级目录映射 目前前后端项目分离场景多了以后,一般是前端一个端口,后端一个端口. 如前端是https://example.com/index.html,调用的接口是https://example.co ...
- Java集合框架个人总结
Java集合框架个人总结 集合主要分为两大类:①单列集合Collection ②双列集合Map 集合存储的都是引用类型,不可是基础类型,如果保存基础类型需要用包装类. 1.Collection接口 ...