【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项目,类型选 ...
随机推荐
- iOS7编程Cookbook中例15.8中一个小问题
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 该书的15.8例子标题为Editing Videos on a ...
- 在github上最热门好评高的ROS相关功能包
在github上最热门最受欢迎的ROS相关功能包 下面依次列出,排名不分先后: 1 Simulation Tools In ROS https://github.com/ros-simulation ...
- 收藏了4年的Android 源码分享
Android 超过2个G的源代码集合~~几乎涵盖了所有功能效果的实现,一应俱全~~应有尽有~~ 360云盘地址:Android 各类源码集合汇总 (提取码:f930) 另外,附上Github上及自己 ...
- android orm持久层框架
; ; i < 2; i++) { )); ); h1.setWord("这是修改过的数据"); tv.setText(tv.getText() + "\n&quo ...
- 一个简单程序快速入门JDBC
首先创建jdbc的库,再在这个库里面创建一张users表. drop database if exists jdbc; create database if not exists jdbc; use ...
- Java spi机制浅谈
最近看到公司的一些框架和之前看到的开源的一些框架的一些服务发现和接入都采用了java的spi机制. 所以简单的总结下java spi机制的思想. 我们系统里抽象的各个模块,往往有很多不同的实现方案,比 ...
- Nginx+PHP-FPM的域Socket配置方法
1什么是域Socket "Unix domain socket 或者 IPCsocket 是一种终端,可以使同一台操作系统上的两个或多个进程进行数据通信.与管道相比,Unix domain ...
- (NO.00004)iOS实现打砖块游戏(六):反弹棒类
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 打砖块游戏另一个要素是反弹棒,我们在这篇类来实现反弹棒类. 创建 ...
- 解读“Deep Neural Decision Forests” 2015 Winner of the David Marr Prize
2015ICCV会议最佳论文奖,即有着"计算机视觉界最高奖"之称的马尔奖(Marr Prize)授予了由微软剑桥研究院(Microsoft Research, Cambridge ...
- iOS中 Swift初级入门学习(三)
// // main.swift // LessonSwift-03 // // Copyright (c) 2015年 韩俊强. All rights reserved. // import Fou ...