qt实现类似QQ伸缩窗口--鼠标事件应用

上一章节讲了qt鼠标事件实现,获取鼠标参数的方法。这一讲主要讲怎么应用上讲的鼠标事件实现一个小功能。
 qq好友对话框右侧 未展开时如图:


鼠标移动到 “隐藏侧边”处单击可以隐藏侧边,隐藏后效果如图:

实现的范例效果如下

1.一般情况

2.鼠标移动到中间分割线中间区域时,效果

3.单击红色按钮后,效果

4.鼠标移动到边界,效果

下面讲解实现过程:
一般情况在QT中,这种伸缩窗体的实现有两种方法:一种是是直接用QSplitter分割器实现;另一种直接用布局管理器自己实现。本节用的是第二种方法实现的。布局管理器有一个layoutSizeConstraint属性,通过设置这个属性可以实现伸展功能。这里用默认属性即可。
1.整个结构分为左侧窗体和右侧窗体,因为左右窗体要用到鼠标事件,所以首先定义一个自定义窗体部件,继承于QFrame,重写mouseMoveEvent事件,用于捕捉鼠标。MouseBase.h 文件如下:

#ifndef MOUSEBASE_H

#define MOUSEBASE_H

#include <QtGui>

#include <QMouseEvent>

class CMouseBase : public QFrame

{

Q_OBJECT

public:

CMouseBase(QWidget *parent = 0);

~CMouseBase();

signals:

void signalsMousePosition(int ix,int iy);

protected :

void mouseMoveEvent ( QMouseEvent  * e );

};

#endif

2.实现文件如下:MouseBase.cpp

#include "MouseBase.h"

CMouseBase::CMouseBase (QWidget *parent) : QFrame(parent)

{

this->setMouseTracking ( true);   //设置此窗体是否跟踪鼠标

}

CMouseBase::~CMouseBase ()

{

}

void CMouseBase::mouseMoveEvent ( QMouseEvent  * e )

{

emit signalsMousePosition(e->x(),e->y());

}

3.新建UI文件,ui中包括 主窗体,左窗体和右窗体类型为CMouseBase,按钮。再把左右窗体放入网格布局管理器中。
4.绑定左右窗体的鼠标信号

connect(ui.LeftFrame,SIGNAL(signalsMousePosition(int,int)),this,SLOT(slotsMousePosition(int,int)));

connect(ui.RightFrame,SIGNAL(signalsMousePosition(int,int)),this,SLOT(slotsMousePosition(int,int))); 
5.信号处理函数如下:

void test::slotsMousePosition(int ix,int iy)

{

CMouseBase *pWidow = qobject_cast< CMouseBase *>(sender());

if(pWidow == ui.RightFrame)

{

//这里传入的坐标是当前对象的相对坐标

int iYTop=(ui.RightFrame->height()- ui.pushButton->height())/2;

int iYBottom=(ui.RightFrame->height()+ ui.pushButton->height())/2;

if((ix<10) &&(ix>0)&&(iy>iYTop)&&(iy<iYBottom))

{

ui.pushButton->show();

}

else

{

ui.pushButton->hide();

}

}

else

{

ui.pushButton->hide();

}

}

qt版本:4.8.6,开发环境:vs2010

本着开源的精神,公布源代码和可执行程序,下载地址:http://yunpan.cn/QaRTy7Au6ByqK (提取码:b7a2)

注:

欢迎交流技术,转载请注明出处并保持作品的完整性。

作者:程序人生
    原文:http://blog.csdn.net/hiwubihe/article/details/38678305

qt实现类似QQ伸缩窗口--鼠标事件应用

时间: 2024-10-29 10:46:12

qt实现类似QQ伸缩窗口--鼠标事件应用的相关文章

基于Qt的类似QQ好友列表抽屉效果的实现

前段时间在忙毕业设计,所以一直没有更新博客.今天答辩完以后,将对我的毕业设计进行模块展示,供Qt初学者进行参考. 毕业设计题目:Linux系统下基于Qt的局域网即时通信系统设计与实现 其中我有一个类似于QQ的好友列表,然后对好友可以进行分组管理,毕设中具体效果图如下: 网上查寻到的设计思路: 1.采用QToolBox的方式,虽然看起来有点样子,但是并不是我们所熟悉的好友列表,比如:http://blog.csdn.net/qianguozheng/article/details/6719074

qt实现类似qq的阴影窗体

#ifndef BFWIDGET_H #define BFWIDGET_H #include <QWidget> #include <QMouseEvent> #include <QResizeEvent> /** * 窗口可以拖动 * 窗口增加阴影效果 * @brief The BFWidget class */ class BFWidget : public QWidget { Q_OBJECT public: explicit BFWidget(QWidget *

java实现类似qq的窗口对聊

Swing实现界面,socket实现通信 package com.learn.talk; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOEx

Opencv鼠标事件

opencv的鼠标事件主要涉及两个函数 回调函数cvSetMouseCallback void cvSetMouseCallback( const char* window_name, CvMouseCallback on_mouse, void* param CV_DEFAULT(NULL)); window_name:鼠标执行的窗口名 on_mouse:每次指定窗口鼠标事件发生时被调用的函数指针 param :传递到回调函数的参数 on_mouse的原型 void Foo(int event

qt 窗口鼠标穿透

Qt 不规则窗体 – 鼠标点击穿透 qt实现鼠标穿透,如果要被穿透窗口只有一层,也即没有嵌套窗口,直接只用对子窗口使用setAttribute (Qt::WA_TransparentForMouseEvents,true);就ok,意味着鼠标事件让父窗口响应. 如果要穿透的窗口含有嵌套窗口,那么接着往下看 快速使用 /////////////////////////////////////////////////////////////// #ifdef Q_OS_LINUX  XShapeCo

QTabWidget 实现类似QQ聊天窗口(拖动分离出新的窗口)

新版本的QQ聊天窗口可以实现拖动,分离出新的窗口.浏览器等软件也可以实现类似操作.所以心血来潮想用Qt实现类似的功能.想用QTabWidget直接实现是很难的,仔细阅读源码,发现QTabWidget内部是由QStackedWidget和QTabBar组合实现的.所以很自然的想到,只要继承QTabBar的子类重新实现QTabBar的 [cpp] view plain copy void mousePressEvent (QMouseEvent *e); void mouseMoveEvent (Q

浅谈Qt事件的路由机制:鼠标事件

请注意,本文是探讨文章而不是教程,是根据实验和分析得出的结果,可能是错的,因此欢迎别人来探讨和纠正. 这几天对于Qt的事件较为好奇,平时并不怎么常用,一般都是用信号,对于事件的处理,一般都是需要响应键盘按键事件的时候,也用得毫无问题,因此也没怎么注意过,翻了下一般qt的教材<精通Qt4编程(第二版)>,里面12.1是这么说的. 当用户按下一个鼠标键时,这个事件首先被发给当前拥有焦点的窗口部件. 看到这里,我第一反应是,真的是这样吗,我表示十分地好奇,于是就赶忙试验了一下.代码比较简单,没有注释

( 转)浅谈QT中窗口刷新事件

浅谈QT中窗口刷新事件 [日期:2011-06-25] 来源:Linux社区  作者:袁硕 [字体:大 中 小] 经过一个星期的项目初步开发,写此文就开发时遇到的一些常见问题,给出些资料和自己的观点,希望能给其他的初学者或者参赛的选手一点帮助,当然,也算是一种抛砖引玉,大家有什么好的技巧经验什么的,也能多多分享,借助这次比赛,我们共同进步~ 如果大家都是跟我一样,刚刚开始接触QT,开始开发QT的程序,肯定也会有很多不习惯的地方,今天我重点想谈的就是这么一个不习惯的地方——QT中窗口刷新事件. 对

C语言控制台窗口图形界面编程(八):鼠标事件

<知识分享> 上次讲的是键盘事件,这次我们介绍鼠标事件.下面先介绍下鼠标事件的结构体以及相关信息. typedef struct _MOUSE_EVENT_RECORD      //鼠标事件结构体 { COORD dwMousePosition;      //当前鼠标在控制台窗口缓冲区的位置 DWORD dwButtonState;        //鼠标按键的状态 DWORD dwControlKeyState;    //控制键状态 DWORD dwEventFlags;