【Qt编程】基于Qt的词典开发系列<四>--无边框窗口的缩放与拖动
在现在,绝大多数软件都向着简洁,时尚发展。就拿有道的单词本和我做的单词本来说,绝大多数用户肯定喜欢我所做的单词本(就单单界面,关于颜色搭配和布局问题,大家就不要在意了)。
有道的单词本:
我所做的单词本:
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #define MARGIN 20//四个角的长度 namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); int countFlag(QPoint p, int row); void setCursorType(int flag); int countRow(QPoint p); protected: void mousePressEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); void mouseDoubleClickEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); private: Ui::Widget *ui; bool isLeftPressed; int curPos; QPoint pLast; }; #endif // WIDGET_H
2、widget.cpp文件
#include "widget.h" #include "ui_widget.h" #include<QMouseEvent> #include<QDebug> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); this->setMouseTracking(true); //设置在不按鼠标的情况下也触发鼠标移动事件,注意QMainWindow的情况:centralWidget()->setMouseTracking(true); isLeftPressed=false; curPos=0;//标记鼠标左击时的位置 this->setMinimumSize(400,300);//设置最小尺寸 QCursor cursor; cursor.setShape(Qt::ArrowCursor);//设置鼠标为箭头形状 // ui->pushButton->setCursor(cursor);//当放在按钮上时,为箭头 // cursor.setShape(Qt::OpenHandCursor); QWidget::setCursor(cursor);//当放在主窗口上时,为手形 qDebug()<<"h="<<this->height(); setWindowFlags(Qt::FramelessWindowHint);//设置主窗口无边框 qDebug()<<this->minimumHeight(); } Widget::~Widget() { delete ui; } void Widget::mousePressEvent(QMouseEvent *event)//鼠标按下事件 { if(event->button()==Qt::LeftButton) { this->isLeftPressed=true; QPoint temp=event->globalPos(); pLast=temp; curPos=countFlag(event->pos(),countRow(event->pos())); event->ignore(); } } void Widget::mouseReleaseEvent(QMouseEvent *event)//鼠标释放事件 { if(isLeftPressed) isLeftPressed=false; QApplication::restoreOverrideCursor();//恢复鼠标指针性状 event->ignore(); } void Widget::mouseDoubleClickEvent(QMouseEvent *event)//鼠标双击 全屏 { if(event->button()==Qt::LeftButton) { if(windowState()!=Qt::WindowFullScreen) setWindowState(Qt::WindowFullScreen); else setWindowState(Qt::WindowNoState);//恢复正常模式 } event->ignore(); } void Widget::mouseMoveEvent(QMouseEvent *event)//鼠标移动事件 { int poss=countFlag(event->pos(),countRow(event->pos())); setCursorType(poss); if(isLeftPressed)//是否左击 { QPoint ptemp=event->globalPos(); ptemp=ptemp-pLast; if(curPos==22)//移动窗口 { ptemp=ptemp+pos(); move(ptemp); } else { QRect wid=geometry(); switch(curPos)//改变窗口的大小 { case 11:wid.setTopLeft(wid.topLeft()+ptemp);break;//左上角 case 13:wid.setTopRight(wid.topRight()+ptemp);break;//右上角 case 31:wid.setBottomLeft(wid.bottomLeft()+ptemp);break;//左下角 case 33:wid.setBottomRight(wid.bottomRight()+ptemp);break;//右下角 case 12:wid.setTop(wid.top()+ptemp.y());break;//中上角 case 21:wid.setLeft(wid.left()+ptemp.x());break;//中左角 case 23:wid.setRight(wid.right()+ptemp.x());break;//中右角 case 32:wid.setBottom(wid.bottom()+ptemp.y());break;//中下角 } setGeometry(wid); } pLast=event->globalPos();//更新位置 } event->ignore(); } int Widget::countFlag(QPoint p,int row)//计算鼠标在哪一列和哪一行 { if(p.y()<MARGIN) return 10+row; else if(p.y()>this->height()-MARGIN) return 30+row; else return 20+row; } void Widget::setCursorType(int flag)//根据鼠标所在位置改变鼠标指针形状 { Qt::CursorShape cursor; switch(flag) { case 11: case 33: cursor=Qt::SizeFDiagCursor;break; case 13: case 31: cursor=Qt::SizeBDiagCursor;break; case 21: case 23: cursor=Qt::SizeHorCursor;break; case 12: case 32: cursor=Qt::SizeVerCursor;break; case 22: cursor=Qt::OpenHandCursor;break; default: // QApplication::restoreOverrideCursor();//恢复鼠标指针性状 break; } setCursor(cursor); } int Widget::countRow(QPoint p)//计算在哪一列 { return (p.x()<MARGIN)?1:(p.x()>(this->width()-MARGIN)?3:2); }
3、main.cpp文件
#include<QtWidgets> #include "widget.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }
程序运行截图如下:
当你将鼠标放在窗口的边缘时,鼠标会变化形状,表示可以拖动窗口。由于没有关闭窗口,只能在强制关闭窗口。如果想做到和不同窗口实现最小化和关闭窗口的画,我们可以在窗口左上角放置两个ToolButton,并设置autorise属性,加上图片即可。下面给出使用上面的无边框窗口所做的词典软件的主界面:
基于Qt的词典开发系列
- 词典框架设计及成品展示
- 本地词典的设计
- 开始菜单的设计
- 无边框窗口的缩放与拖动
- 无边框窗口的拖动
- 界面美化设计
- 调用网络API
- 用户登录及API调用的实现
- JSON数据解析
- 国际音标的显示
- 系统托盘的显示
- 调用讲述人
- 音频播放
- 自动补全功能
- HTML特殊字符及正则表达式
- 后序
原文:http://blog.csdn.net/tengweitw/article/details/38758051
作者:nineheadedbird
【Qt编程】基于Qt的词典开发系列<四>--无边框窗口的缩放与拖动的更多相关文章
- 【Qt编程】基于Qt的词典开发系列<五>--无边框窗口的拖动
在上一篇文章中,我们讲述了如何进行无边框窗口的缩放与拖动,而在一些情况下,我们的窗口只需要进行拖动也不需要改变其大小,比如:QQ的登录窗口.本来在上一篇文章中已经讲述了如何进行窗口的拖动,但是却与窗口 ...
- 【Qt编程】基于Qt的词典开发系列<二>--本地词典的设计
我设计的词典不仅可以实现在线查单词,而且一个重大特色就是具有丰富的本地词典库:我默认加入了八个类型的词典,如下所示: 由于是本人是通信专业,因此加入了华为通信词典.电子工程词典,又由于我喜爱编程,也加 ...
- 【Qt编程】基于Qt的词典开发系列--后序
从去年八月份到现在,总算完成了词典的编写以及相关技术文档的编辑工作.从整个过程来说,文档的编写比程序的实现耗费的时间更多.基于Qt的词典开发系列文章,大致包含了在编写词典软件过程中遇到的技术重点与难点 ...
- 【Qt编程】基于Qt的词典开发系列<六>--界面美化设计
本文讲一讲界面设计,作品要面向用户,界面设计的好坏直接影响到用户的体验.现在的窗口设计基本都是扁平化的,你可以从window XP与window 8的窗口可以明显感觉出来.当然除了窗口本身的效果,窗口 ...
- 【Qt编程】基于Qt的词典开发系列<三>--开始菜单的设计
这篇文章讲讲如何实现开始菜单(或者称为主菜单)的设计.什么是开始菜单呢?我们拿常用的软件来用图例说明,大多数软件的开始菜单在左下角,如下图: 1.window 7的开始菜单 2.有道词典的主菜单 3. ...
- 【Qt编程】基于Qt的词典开发系列<一>--词典框架设计及成品展示
去年暑假的时候,作为学习Qt的实战,我写了一个名为<我爱查词典>的词典软件.后来由于导师项目及上课等原因,时间不足,所以该软件的部分功能欠缺,性能有待改善.这学期重新拿出来看时,又有很多东 ...
- 【Qt编程】基于Qt的词典开发系列<十>--国际音标的显示
在年前的一篇文章中,我提到要学习Qt.于是在这学期看了一个月的qt.现在大致对qt有了一些了解.但是现在导师又把我调到了android应用开发平台,所以说qt的学习要搁置了.本打算这学期做一个单词查询 ...
- 【Qt编程】基于Qt的词典开发系列<十二>调用讲述人
我们知道,win7系统自带有讲述人,即可以机器读出当前内容,具体可以将电脑锁定,然后点击左下角的按钮即可.之前在用Matlab写扫雷游戏的时候,也曾经调用过讲述人来进行游戏的语音提示.具体的Matla ...
- 【Qt编程】基于Qt的词典开发系列<十一>系统托盘的显示
本文主要讨论Qt中的系统托盘的设置.系统托盘想必大家都不陌生,最常用的就是QQ.系统托盘以简单.小巧的形式能让人们较快的打开软件.废话不多说,下面开始具体介绍. 首先,新建一个Qt Gui项目,类型选 ...
随机推荐
- Android开发基础规范(一)
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52602487 前言:Androi ...
- memcached实战系列(一)memcached安装
下载并安装Memcached服务器端 我用的是cenos6.5 64位系统. libevent是个程序库,它将Linux的epoll.BSD类操作系统的kqueue等事件处理功能封装成统一的接口,具有 ...
- (一一九)通过CALayer实现阴影、圆角、边框和3D变换
在每个View上都有一个CALayer作为父图层,View的内容作为子层显示,通过layer的contents属性决定了要显示的内容,通过修改过layer的一些属性可以实现一些华丽的效果. [阴影和圆 ...
- Java程序员的必备知识-类加载机制详解
类加载器的概念 类加载器是一个用来加载类文件的类. Java源代码通过javac编译器编译成类文件.然后JVM来执行类文件中的字节码来执行程序.类加载器负责加载文件系统.网络或其他来源的类文件. JV ...
- Tomcat集群应用部署的实现机制
集群应用部署是一个很重要的应用场景,设想一下如果没有集群应用部署功能,每当我们发布应用时都要登陆每台机器对每个tomcat实例进行部署,这些工作量都是繁杂且重复的,而对于进步青年的程序员来说是不能容忍 ...
- 2.QT中操作word文档
Qt/Windows桌面版提供了ActiveQt框架,用以为Qt和ActiveX提供完美结合.ActiveQt由两个模块组成: A QAxContainer模块允许我们使用COM对象并且可以 ...
- Github上怎么修改别人的项目并且提交给原作者!图文并茂!
Github上怎么修改别人的项目并且提交给原作者!图文并茂! 写这篇博客的初衷,是因为我的项目Only需要一些朋友一起参与进来,但是很多的Git都不是很熟练,其实版本控制这种东西没有什么难度的,只要稍 ...
- Hibernate初体验及简单错误排除
Hibernate是什么,有多少好处,想必查找这类博文的都知道,所以就不多说了.下面是我对Hibernate简单使用的一个小小的总结.与君(主要是刚入门的)共勉吧! 创建的顺序 创建Hibernate ...
- 03一些View总结
第三天 一 TextView 父类 : View >概念:文本控件 :文本内容的显示 默认配置不可编辑 子类EditText可以编辑 >属性: ...
- (NO.00004)iOS实现打砖块游戏(五):游戏场景类
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 创建游戏场景类头文件 在Xcode创建新GameScene类,继 ...