如何用qt实现qq登录界面翻转效果,这个问题已经纠结我很久了。在一段时间后,再次重新回到这个问题,终于解决了

QWidget是甚于2维坐标的,所以要实现像qq那样的翻转效果,必须要能够绕y轴在3维空间旋转。看了一些网上教程参考博客

http://www.th7.cn/Program/Python/201504/430277.shtml

用到的是QGraphics框架,所以也就用它做了。

注意看的话,上面好像有点bug;不要怀疑,那是因为GIF播放结束,重新播放时的重置效果。代码如下

#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QGraphicsProxyWidget>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QTimer>
#include <QDebug>
#include <QTimeLine>int main(int argc, char *argv[])
{QApplication a(argc, argv);//新建登录窗体控件QWidget *wid1 = new QWidget;QLabel *user = new QLabel(QStringLiteral("用户名:"));QLabel *password = new QLabel(QStringLiteral("密  码:"));QLineEdit *userEdit = new QLineEdit;userEdit->setPlaceholderText(QStringLiteral("请输入用户名"));QLineEdit *passwordEdit = new QLineEdit;passwordEdit->setPlaceholderText(QStringLiteral("请输入密码"));//输入窗体布局QHBoxLayout *usrHBoxLay = new QHBoxLayout;usrHBoxLay->addWidget(user);usrHBoxLay->addWidget(userEdit);QHBoxLayout *passwordHBoxLay = new QHBoxLayout;passwordHBoxLay->addWidget(password);passwordHBoxLay->addWidget(passwordEdit);QVBoxLayout *vBoxLay1 = new QVBoxLayout;vBoxLay1->addLayout(usrHBoxLay);vBoxLay1->addLayout(passwordHBoxLay);wid1->setLayout(vBoxLay1);//新建设置窗体控件QWidget *wid2 = new QWidget;QLabel *ip = new QLabel(QStringLiteral("IP地址"));QLabel *port = new QLabel(QStringLiteral("端口号"));QLineEdit *ipEdit = new QLineEdit;ipEdit->setPlaceholderText(QStringLiteral("请输入IP地址"));QLineEdit *portEdit = new QLineEdit;portEdit->setPlaceholderText(QStringLiteral("请输入端口号"));//设置窗体布局QHBoxLayout *ipHBoxLay = new QHBoxLayout;ipHBoxLay->addWidget(ip);ipHBoxLay->addWidget(ipEdit);QHBoxLayout *portHBoxLay = new QHBoxLayout;portHBoxLay->addWidget(port);portHBoxLay->addWidget(portEdit);QVBoxLayout *vBoxLay2 = new QVBoxLayout;vBoxLay2->addLayout(ipHBoxLay);vBoxLay2->addLayout(portHBoxLay);wid2->setLayout(vBoxLay2);//新建View和SceneQGraphicsView *view = new QGraphicsView;QGraphicsScene *scene = new QGraphicsScene;view->setScene(scene);//加入登录和设置窗体QGraphicsProxyWidget *graphicsWid1 = scene->addWidget(wid1);QGraphicsProxyWidget *graphicsWid2 = scene->addWidget(wid2);//设置窗体旋转-180度,并隐藏graphicsWid2->setTransform(QTransform().translate(graphicsWid2->boundingRect().width()/2,graphicsWid2->boundingRect().height()/2).rotate(-180,Qt::YAxis).translate(-graphicsWid2->boundingRect().width()/2,-graphicsWid2->boundingRect().height()/2));graphicsWid2->setVisible(false);//新建线型值闹钟QTimeLine *timeLine = new QTimeLine(1500,scene);timeLine->setStartFrame(0);timeLine->setEndFrame(180);//每次值发生变化,旋转一定角度QObject::connect(timeLine,&QTimeLine::frameChanged,[timeLine,graphicsWid1,graphicsWid2](const int frame){//对于登录窗体正常旋转graphicsWid1->setTransform(QTransform().translate(graphicsWid1->boundingRect().width()/2,graphicsWid1->boundingRect().height()/2).rotate(frame,Qt::YAxis).translate(-graphicsWid1->boundingRect().width()/2,-graphicsWid1->boundingRect().height()/2));//对于设置窗体由于开始旋转到了-180度,所以现在应该是-179,-176,-170....,0,这里应该是frame-180;也就是加上起点为-180度啦graphicsWid2->setTransform(QTransform().translate(graphicsWid2->boundingRect().width()/2,graphicsWid2->boundingRect().height()/2).rotate(frame - 180,Qt::YAxis).translate(-graphicsWid2->boundingRect().width()/2,-graphicsWid2->boundingRect().height()/2));switch (timeLine->direction()) {case QTimeLine::Forward: //前面向后面转,frame从0到180,当frame大于或等于90度时,显示设置窗体,登录窗体隐藏if(frame > 90 || frame == 90){graphicsWid1->setVisible(false);graphicsWid2->setVisible(true);}break;case QTimeLine::Backward: //后面向前面转,frame从180到0,当frame小于或等于90度时,显示登录窗体,设置窗体隐藏if(frame < 90 || frame == 90){graphicsWid1->setVisible(true);graphicsWid2->setVisible(false);}break;}});//旋转结束后,设置线形闹钟值的方向QObject::connect(timeLine,&QTimeLine::finished,[timeLine]{timeLine->toggleDirection();});//启用闹钟,每过一段时间,启动一次线型闹钟QTimer *timer = new QTimer;timer->setInterval(3000);QObject::connect(timer,&QTimer::timeout,[timeLine]{timeLine->start();});view->show();timer->start();return a.exec();
}

QTimeLine 是一个线形值定时器

它可以附带一个值的变化,对应的信号是valueChanged和frameChanged。valueChanged是0-1之间,frameChanged是startFrame()和endFrame()之间,对应值
是从小到大方向,还是从大到小方向;这个取决于direction()属性值。

setTransform是一个设置旋转的函数,函数执行结束直接旋转到指定位置

在QGraphicsScene中的图元或者QWidget通过QGraphicsScene通过addWidget返回的QGraphicsProxyWidget都可以通过该函数旋转,并且可以指定旋转轴。
在开始窗体的角度为0度,初始化后背面的窗体变为-180度;在闹钟驱动旋转时,此时背面窗体要与前面窗体一起旋转,而且角度应该是-180度到0度,线形闹钟反向,然后又是0度到-180度这点很关键。而前面的窗体开始是0度,旋转一次后变180,线型闹钟反向,再转一次又回到0就不需要额外操作。第一次做就是没有注意到这里,所以没有解决,这次终于搞定。另外就是根据旋转方向设置其中一个隐藏,一个显示以90度为界限,这个大家都懂吧。

其它方法

也就是在今晚发面这篇博客的同时,我突然搜到了一个解决这个问题的另一种方案,为什么在今晚写博客之前,从未找到过,真草蛋。
方法类似,主要还是我对类还不够全面的熟悉呀。原来QPainter也有setTransform方法,这样就可以直接在QWidget的paint函数中直接旋转了就用不着QGraphics框架了
。同时也谢谢搜到的那篇博主。

qt 完全实现qq翻转登录界面相关推荐

  1. Fdog系列(四):使用Qt框架模仿QQ实现登录界面,界面篇。

    文章目录 一. 前言 二. 正文 1. 创建窗口,添加基本组件 2. 自定义标题,隐藏任务栏标题,实现系统托盘显示 3. 美化主界面,文本框的奇思妙想 4. 实现背景阴影 一. 前言 Fdog系列已写 ...

  2. QT 实现类似于qq的登录注册界面

    QT 实现类似于qq的登录界面(仅供参考) 看一下效果图 一:首先创建一个widget项目设计ui界面 使用了LineEdit,QPushButton,QToolButton,QLabel,还有弹簧 ...

  3. HTML+CSS 模拟QQ邮箱登录界面

    模拟QQ邮箱登录界面 index.html <!DOCTYPE html> <html lang="en"> <head><meta ch ...

  4. Qt之模仿QQ主面板界面

    Qt之模仿QQ主面板界面 Qt之模仿QQ主面板界面 效果图 结尾 效果图 这里大家值得注意的是,QQ等级设置,已经列表展开搜索时的三角符的旋转效果 //QQMainWindow.cpp #includ ...

  5. 3、React Native实战——实现QQ的登录界面

    今天记录的是使用React Native实现QQ的登录界面,如果不了解React Native,请看React Native中文网站:http://reactnative.cn/ 下面是一张手机QQ的 ...

  6. ios 仿电脑qq登录界面_iOS开发UI篇—模仿ipad版QQ空间登录界面

    iOS开发UI篇-模仿ipad版QQ空间登录界面 一.实现和步骤 1.一般ipad项目在命名的时候可以加一个HD,标明为高清版 2.设置项目的文件结构,分为home和login两个部分 3.登陆界面的 ...

  7. label qt 自动换行_QT编写一个登录界面

    前言 继上篇:一起学Qt之基础篇---入门 今天上手实操用QT编写一个登录界面~ 系统权限这个词大家肯定不陌生,你进入一个网站也是,如果不登录,就是以游客的身份进去的,要想看到某些信息肯定需要进行登录 ...

  8. Java实现QQ简易登录界面

    今天来分享一下我做这个QQ登录界面的思路和代码,内容很简单,大家可以动手写写,哈哈写一个可见的图形化界面比枯燥的算题确实要有意思..有成就感一些 我这里一共是写了两个类,,界面类和监听器类,,我简单的 ...

  9. 简单步骤,使用 Android studio 实现保存 QQ 账号密码,和简易 QQ 用户登录界面

    利用 Android studio 2021 软件输出一个简易用户登录界面,拥有头像并且能够实现对自行输入的账号密码进行保存,文件名为 saveqq,功能实现对账号与密码的输入和存储,简单QQ界面布局 ...

最新文章

  1. 记录一下CUDA-opencv联合编程
  2. UI设计十戒--设计师的艺术
  3. for each .. in ,for ... in , for ... of的用法
  4. 【转】Photoshop网站设计:DesignStudio
  5. think PHP全栈开发教程,【Thinkphp教程】模板中使用函数
  6. 未来两年内的九大信息安全威胁(三)
  7. centos7 转换为lvm_(建议收藏)CentOS7挂载未分配的磁盘空间以及LVM详细介绍
  8. raspberry pi_用Raspberry Pi制作婴儿监视器
  9. 我看ITIL在中国(六):如何建设有中国特色的IT运维管理平台【三】
  10. win03组策略-入门篇
  11. 中过滤记录中时间_初效板式过滤器使用中这些事情你要知道?
  12. python批量修改图片后缀名
  13. 【软技能】完全写作指南--即时信息
  14. 软件测试 | 手把手教你如何使用 ABD调试工具,学不会算我的!
  15. HALO:用于MR扫描器中实时头部对准的工具
  16. 关于网络、交换机、路由器
  17. conda安装packages时报错File “C:\ProgramData\anaconda3\lib\site-packages\conda\core\subdir_data.py“
  18. HTML,JS与CSS
  19. python合并两个列表并去重_python合并多个txt文件
  20. 线程进程计算之多任务同步进行

热门文章

  1. 亚马逊、shopee、Lazada、ebay、速卖通补单不安全?刷单要注意这4点
  2. 【手游】魔灵幻想 美术资源加密分析
  3. 转贴:读山老农的《白昼岂知黑夜之黑——加谬》
  4. Matlab画三维图的一些技巧
  5. opencc 1.0.2
  6. 这才是学习Linux的正确姿势
  7. 关于魔浪o5的连接出现的问题解决办法
  8. 运行自定义映像。linux,安装和使用virt-customize自定义Qcow2/Raw Linux OS磁盘映像
  9. html5中audio标签
  10. redis的雪崩、穿透、击穿解析