QTabWidget 实现类似QQ聊天窗口(拖动分离出新的窗口)
新版本的QQ聊天窗口可以实现拖动,分离出新的窗口。浏览器等软件也可以实现类似操作。所以心血来潮想用Qt实现类似的功能。想用QTabWidget直接实现是很难的,仔细阅读源码,发现QTabWidget内部是由QStackedWidget和QTabBar组合实现的。所以很自然的想到,只要继承QTabBar的子类重新实现QTabBar的
- void mousePressEvent (QMouseEvent *e);
- void mouseMoveEvent (QMouseEvent *e);
- void mouseReleaseEvent (QMouseEvent *e);
这三个方法,再把子定义的TabBar设置给QTabWidget就差不多了。但是还有个问题,QTabWidget的 setTabBar方法是protected的,所以只好再自定义一个QTabWidget的子类,在子类里调用setTabBar了。以下是我的简单实现:
- class myTabBar:public QTabBar
- {
- Q_OBJECT
- public:
- myTabBar(QWidget *parent = NULL);
- ~myTabBar();
- protected:
- void mousePressEvent (QMouseEvent *e);
- void mouseMoveEvent (QMouseEvent *e);
- void mouseReleaseEvent (QMouseEvent *e);
- signals:
- void starDragTab(int index);
- void endDragTab();
- private:
- void drag();
- bool m_isDrag;
- QPoint m_mousePressPoint;
- QPoint m_mouseReleasePoint;
- };
- void myTabBar::mouseMoveEvent(QMouseEvent *e)
- {
- int index = this->currentIndex();
- if (m_isDrag)
- {
- QPoint Point = e->pos();
- //拖动的垂直距离大于Bar的高度的话就新建一个窗口,这个应该比较好理解啊
- if (qAbs(m_mousePressPoint.y() - Point.y()) > this->height())
- {
- emit starDragTab(index);
- }
- }
- QTabBar::mouseMoveEvent(e);
- }
- void myTabBar::mousePressEvent(QMouseEvent *e)
- {
- if (e->button() == Qt::LeftButton)
- {
- m_isDrag = true;
- m_mousePressPoint = e->pos();
- }
- QTabBar::mousePressEvent(e);
- }
- void myTabBar::mouseReleaseEvent(QMouseEvent *e)
- {
- if (e->button() == Qt::LeftButton)
- {
- m_mouseReleasePoint = e->pos();
- if (qAbs(m_mousePressPoint.y() - m_mouseReleasePoint.y()) > this->height())
- {
- emit endDragTab();
- }
- }
- QTabBar::mouseReleaseEvent(e);
- }
- class myTabWidget:public QTabWidget
- {
- Q_OBJECT
- public:
- myTabWidget(QWidget *parent = NULL);
- ~myTabWidget();
- private slots:
- void starDrag(int index);
- void endDrag();
- private:
- myTabBar *m_pTabBar;
- QString m_dragTabLabel;
- QWidget *m_pDragWidget;
- int m_dragIndex;
- };
- myTabWidget::myTabWidget(QWidget *parent/* = NULL*/):QTabWidget(parent)
- {
- this->setAcceptDrops(true);
- setMouseTracking(true);
- m_pTabBar = new myTabBar(this);
- m_pTabBar->setMovable(true);
- setTabBar(m_pTabBar); //设置自定义的Bar给TabWidget
- m_pDragWidget = NULL;
- connect(m_pTabBar,SIGNAL(starDragTab(int)),this,SLOT(starDrag(int)));
- connect(m_pTabBar,SIGNAL(endDragTab()),this,SLOT(endDrag()));
- }
- void myTabWidget::starDrag(int index)
- {
- m_dragTabLabel = this->tabText(index);
- m_pDragWidget = this->widget(index);
- m_dragIndex = index;
- QPixmap pix;
- //pix = QPixmap::grabWidget(m_pDragWidget);
- pix = QPixmap::grabWindow(this->winId());
- if (pix.isNull())
- {
- int i;
- }
- QMimeData *mimeData = new QMimeData;
- //mimeData->setText("drag tab");
- QDrag *drag = new QDrag(this);
- drag->setMimeData(mimeData);
- drag->setPixmap(pix.scaled(QSize(200,200))); //这里主要是想想QQ一样,可以拖动的过程显示被拖动窗口的图片。但是效果还不是很好
- drag->exec();
- }
- void myTabWidget::endDrag()
- {
- myTabWidget *pWidget = new myTabWidget(NULL);
- if (m_pDragWidget)
- {
- //新建一个独立的窗口
- removeTab(m_dragIndex);
- pWidget->addTab(m_pDragWidget,m_dragTabLabel);
- pWidget->show();
- }
http://blog.csdn.net/hai200501019/article/details/8987379
QTabWidget 实现类似QQ聊天窗口(拖动分离出新的窗口)的更多相关文章
- [C# 网络编程系列]专题九:实现类似QQ的即时通信程序
转自:http://www.cnblogs.com/zhili/archive/2012/09/23/2666987.html 引言: 前面专题中介绍了UDP.TCP和P2P编程,并且通过一些小的示例 ...
- WinForm实现类似QQ停靠,显示隐藏过程添加特效效果
原文:WinForm实现类似QQ停靠,显示隐藏过程添加特效效果 这可能是个老题长谈的问题了,只是在项目中会用到这个效果,所以今天做个记录.大家见了别喷我.在项目中的需求是这样的. 打开程序,在屏幕的右 ...
- .net winForm 实现类似qq 弹出新闻
.net winForm 实现类似qq 弹出新闻 一.背景: echong 之前一直用 公司大牛c语言写的一个弹出托管,前几天写东西的时候发现com调用不是那么好使.而手头上写的这个东西又是.ne ...
- 用C#代码实现类似QQ窗体的“上、左、右”停靠功能
大家都知道QQ有一个自动停靠功能,即“上.左.右”,当你把窗体拖到屏幕边缘,然后移开鼠标它会自动缩放,然后只显示一小小点出来,我们仔细观察会发现其实它只露3像素左右的边缘,当你鼠标移上去它又会伸出来, ...
- 详解C# 网络编程系列:实现类似QQ的即时通信程序
https://www.jb51.net/article/101289.htm 引言: 前面专题中介绍了UDP.TCP和P2P编程,并且通过一些小的示例来让大家更好的理解它们的工作原理以及怎样.Net ...
- 转:【专题九】实现类似QQ的即时通信程序
引言: 前面专题中介绍了UDP.TCP和P2P编程,并且通过一些小的示例来让大家更好的理解它们的工作原理以及怎样.Net类库去实现它们的.为了让大家更好的理解我们平常中常见的软件QQ的工作原理,所以在 ...
- QQ聊天窗口上的广告与QQ弹窗广告的完美屏蔽去除
涉及的软件 1. QQ (笔者的为v8.2版本) 2. Win7 3. ADSafe(3.13.308.9900正式版) 前言 QQ广告十分讨人厌,除了QQ弹窗的广告,让人十分反感外,最近发现QQ聊 ...
- 专题九:实现类似QQ的即时通信程序
引言: 前面专题中介绍了UDP.TCP和P2P编程,并且通过一些小的示例来让大家更好的理解它们的工作原理以及怎样.Net类库去实现它们的.为了让大家更好的理解我们平常中常见的软件QQ的工作原理,所以在 ...
- 使用plupload做一个类似qq邮箱附件上传的效果
公司项目中使用的框架是springmvc+hibernate+spring,目前需要做一个类似qq邮箱附件上传的功能,暂时只是上传小类型的附件 处理过程和解决方案都需要添加附件,处理过程和解决方案都可 ...
随机推荐
- js div 内容显示分页
由于工作需要 div固定大小 而内容不定 所以 如果内容过多自然就显示不出来了 所以 需要分页一类的功能下面是代码 <!DOCTYPE html PUBLIC "-//W3C//DTD ...
- sign a third-party dll which don't have a strong name
Problem: Assembly generation failed -- Referenced assembly '' does not have a strong name Cause: thi ...
- CodeFirst-Section1之小例子
尽可能做到不说一些晦涩难懂的语言,Follow Me...... 环境:Visual Studio 2013+.Net Framework 4.5 1.什么是Code First? 说白了就是先建好C ...
- 基于maven插件的缓存控制插件
asset-cache-control github源码及下载地址: https://github.com/StruggleBird/asset-cache-control 基于maven插件的缓存控 ...
- linux账户管理(centos)
1./etc/passwd 非常详细的/etc/passwd解释 http://luzl.iteye.com/blog/564404 vi /etc/passwd,可以看到如下信息,在最后一行可以看到 ...
- 「OC」 封装
一.面向对象和封装 面向对象的三大特性:封装.继承和多态 在OC语言中,使用@interface和@implementation来处理类. @interface就好像暴露在外面的时钟表面,像外界提 ...
- Python (九) 协程以及数据库操作
本节内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操做 Paramiko SSH 协程 协程,又称微线程,纤程.英文名Coroutine ...
- qstring.h赏析
https://github.com/qtproject/qtbase/blob/dev/src/corelib/tools/qstring.h C:\Qt\Qt5.3.2_min\5.3\mingw ...
- BZOJ 1324: Exca王者之剑
1324: Exca王者之剑 Description Input 第一行给出数字N,M代表行列数.N,M均小于等于100 下面N行M列用于描述数字矩阵 Output 输出最多可以拿到多少块宝石 Sam ...
- java学习之IO装饰设计模式
装饰设计模式就是对已有的对象的功能进行增强 当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能.那么自定义的该类称为装饰类. 装饰类通常会通过构造方法接收被装 ...