目录

一:自定义图元控件

二:定时器的使用

三:动画效果

四:核心源码

五:项目完整源码分享


一:自定义图元控件

视图类,命名,继承QObject信号槽机制 

图元类,命名,继承QObject信号槽机制 

二:定时器的使用

三:动画效果

图元动画显示结果如下

利用定时器

advance

控制图元进行移动

图元相互靠近 

图元互相远离 

图元 碰撞检测

四:核心源码

myview.h .cpp【视图类】

#ifndef MYVIEW_H
#define MYVIEW_H#include <QObject>
#include<QGraphicsView>    //视图
#include<QGraphicsScene>   //场景
#include"myitem.h"
#include<QTimer>//定时器class myView : public QGraphicsView//派生出自己的视图类
{Q_OBJECT
public:explicit myView();QGraphicsScene *myScene;//视图中放置场景myItem *item1;myItem *item2;QTimer *timer;signals:public slots:void timeSlot();
};#endif // MYVIEW_H
#include "myview.h"
#include<QDebug>myView::myView()
{this->resize(800,800);QGraphicsScene *myScene = new QGraphicsScene;this->setScene(myScene);  //视图中添加场景item1 = new myItem(":/image/050302.png",1,1);//图元1类型item2 = new myItem(":/image/050302.png",2,1);//图元2类型item1->setPos(100,this->height()/2);item2->setPos(500,this->height()/2);myScene->addItem(item1);  //场景中放置图元myScene->addItem(item2);  //场景中放置图元timer = new QTimer(this);//connect(timer,SIGNAL(timeout()),this,SLOT(timeSlot()));//让场景中的图元得到控制connect(timer,SIGNAL(timeout()),myScene,SLOT(advance()));timer->start(1000);}void myView::timeSlot()
{qDebug()<<"timeSlot";}

myitem.h .cpp 【图元类】

#ifndef MYITEM_H
#define MYITEM_H#include <QObject>
#include<QGraphicsItem>//图元class myItem : public QObject,public QGraphicsItem
{Q_OBJECT
public:explicit myItem(QObject *parent = 0);myItem(QString filename,int iType,bool isStatus);//碰撞检测函数QRectF boundingRect() const;//虚函数函数字体是斜体字//图元绘制函数void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);QPixmap image;  //图元图片int iType;      //图元类型bool isStatus;  //图元状态signals:public slots:void advance(int phase);//纯虚函数 -- 需要实现
};#endif // MYITEM_H
#include "myitem.h"
#include<QPainter>
#include<QDebug>
#include"indexwin.h"myItem::myItem(QObject *parent) : QObject(parent)
{}myItem::myItem(QString filename, int iType, bool isStatus)
{image.load(filename);this->iType = iType;this->isStatus = isStatus;}//碰撞 特效 需要的类
//返回值:一个矩形
QRectF myItem::boundingRect() const
{return QRectF(0-image.width()/2,0-image.height()/2,image.width(),image.height());}void myItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{painter->drawPixmap(0-image.width()/2,0-image.height()/2,image.width(),image.height(),image);}void myItem::advance(int phase)
{qDebug()<<"advance";if(this->iType ==1){//碰撞会将图元加到链表//链表数量大于0就是发生碰撞了if(collidingItems().count()>0){qDebug()<<"碰撞了";// 跳转界面// IndexWin *p = new IndexWin;// p->show();}//坐标相对于场景进行变化  方向 位置this->setPos(mapToScene(2,0));//-2向左移动}if(this->iType ==2){//坐标相对于场景进行变化  方向 位置this->setPos(mapToScene(-2,0));//2向右移动}}

五:项目完整源码分享

indexwin.h .cpp【布局管理的学习】

#ifndef INDEXWIN_H
#define INDEXWIN_H#include <QWidget>
#include<QVBoxLayout>//垂直布局
#include<QHBoxLayout>//水平布局
#include<QPushButton>
#include<QLineEdit>
#include<QListWidget>//制作视频页面列表class IndexWin : public QWidget
{Q_OBJECT
public:explicit IndexWin(QWidget *parent = 0);QWidget *leftwin;QWidget *topwin;QWidget *indexwin;QWidget *rightwin;QListWidget *videowinlist;//制作视频页面列表QLineEdit *searchEdit;QPushButton *userBtn;QPushButton *vipBtn;signals:public slots:void goNewwinSlot();
};#endif // INDEXWIN_H
#include "indexwin.h"
#include<QStringList>
#include<QDebug>
#include<QMessageBox>//弹窗
#include<QListWidget>//多个按钮显示,存放窗口的容器
#include<QDir>//路径
#include<QPixmap>//放置图片
#include<QListView>//设置图片模式IndexWin::IndexWin(QWidget *parent) : QWidget(parent)
{this->resize(1500,800);leftwin = new QWidget();topwin = new QWidget();//indexwin = new QWidget();rightwin = new QWidget();videowinlist = new QListWidget();//视频列表//设置图片模式--上面图片下面名称videowinlist->setViewMode(QListView::IconMode);//获取视频图片路径QString videopath = QDir::currentPath()+"/image";qDebug()<<videopath;QDir dir(videopath);//查找目录QStringList moviename;moviename << "*.png";//查找.png图片QStringList files = dir.entryList(moviename,QDir::Files|QDir::Readable,QDir::Name);qDebug()<<files; //查找.png图片名for(int i=0;i<files.size();i++){//显示.png图片及名称QListWidgetItem *newitem = new QListWidgetItem(QIcon(QPixmap(videopath+"/"+files.at(i))),files.at(i));//设置图片尺寸newitem->setSizeHint(QSize(200,150));videowinlist->addItem(newitem);}//方法一:自定义所有控件//控件水平  顶部控件水平分布QHBoxLayout *hboxlayout = new QHBoxLayout(topwin);searchEdit = new QLineEdit();userBtn = new QPushButton();vipBtn = new QPushButton();hboxlayout->addStretch();hboxlayout->addWidget(searchEdit);hboxlayout->addWidget(userBtn);hboxlayout->addWidget(vipBtn);//方法二:动态创建所有控件//按钮控件垂直  左边窗口放置一个垂直布局QVBoxLayout *vboxlayout1 = new QVBoxLayout(leftwin);QStringList funBtnlist;funBtnlist<<"logo"<<"视频"<<"动漫"<<"电影";for(int i=0;i<funBtnlist.size();i++){QPushButton *newBtn = new QPushButton(funBtnlist.at(i));//多个按钮绑定一个槽connect(newBtn,SIGNAL(clicked(bool)),this,SLOT(goNewwinSlot()));vboxlayout1->addWidget(newBtn);}//加空白 -- 将按钮上置vboxlayout1->addStretch();//两个窗口垂直//右半部分的布局放置顶部窗口和主窗口QVBoxLayout *rightboxlayout = new QVBoxLayout(rightwin);rightboxlayout->addWidget(topwin);//rightboxlayout->addWidget(indexwin);rightboxlayout->addWidget(videowinlist);//左边窗口和前面两个窗口垂直的部分 进行水平放置  最大的布局有thisQHBoxLayout *mainlayout = new QHBoxLayout(this);mainlayout->addWidget(leftwin);//放置窗口//mainlayout->addLayout(rightboxlayout);//放置布局mainlayout->addWidget(rightwin);
}void IndexWin::goNewwinSlot()
{//获取点击按钮的文本信息QPushButton *btn = (QPushButton *)sender();QString btnName = btn->text();qDebug()<<btn->text();//根据文本进行判断if(btnName == "logo"){//弹窗显示信息QMessageBox::information(NULL,"logo模块","这是logo模块测试");}if(btnName == "视频"){QMessageBox::information(NULL,"电视模块","这是电视模块测试");}if(btnName == "动漫"){QMessageBox::information(NULL,"动漫模块","这是动漫模块测试");}if(btnName == "电影"){QMessageBox::information(NULL,"电影模块","这是电影模块测试");}}

usersdata.h .cpp【多用户登录的学习】

#ifndef USERSDATA_H
#define USERSDATA_H
#include<QString>//字符串class usersdata
{
public:usersdata();//默认构造usersdata(QString username,QString userpwd);//带参构造void setUsername(QString username);QString getUsername();void setUserpwd(QString userpwd);QString getUserpwd();private:QString username;QString userpwd;
};#endif // USERSDATA_H
#include "usersdata.h"usersdata::usersdata()
{}usersdata::usersdata(QString username, QString userpwd)
{this->username = username;this->userpwd = userpwd;
}void usersdata::setUsername(QString username)
{this->username = username;
}QString usersdata::getUsername()
{return username;
}void usersdata::setUserpwd(QString userpwd)
{this->userpwd = userpwd;
}QString usersdata::getUserpwd()
{return userpwd;
}

widget.h .cpp 【绘制界面 以及 信号和槽的学习】

#ifndef WIDGET_H
#define WIDGET_H#include<QPushButton>//按钮
#include<QLineEdit>//编辑框
#include<QLabel> //文本
#include<QMovie> //动态图#include <QWidget>
#include<QList>
#include"usersdata.h"class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = 0);~Widget();QPushButton *loginBtn; //登录按钮QLineEdit *userEdit;   //用户编辑框QLineEdit *pwdEdit;    //密码编辑框QLabel *logoLab;       //logo文本,放置图片QLabel *userLab;       //用户文本QLabel *pwdLab;        //密码文本QLabel *loginLab;      //登录界面文本QLabel *gifLab;        //放置动态图文本QMovie *movie;         //动态图QList<usersdata *> userlist;//用户链表//所有槽函数的定义使用
public slots:void goLoginSlot();
};#endif // WIDGET_H
#include "widget.h"
#include<QDebug>     //输出头文件
#include"indexwin.h" //主界面窗口
#include<QDesktopWidget>//分辨率Widget::Widget(QWidget *parent): QWidget(parent)
{//数据类的准备usersdata *user1 = new usersdata("admin","123456");usersdata *user2 = new usersdata("manager","123456");userlist.append(user1);userlist.append(user2);//窗口大小设置this->resize(500,400);//setWindowFlags(Qt::FramelessWindowHint);//无边框//setAttribute(Qt::WA_TranslucentBackground);//背景透明QDesktopWidget w;int deskWidth = w.width();int deskHeight = w.height();qDebug()<<deskWidth<<deskHeight;//创建对象loginBtn = new QPushButton(this);userEdit = new QLineEdit(this);pwdEdit = new QLineEdit(this);logoLab = new QLabel(this);userLab = new QLabel(this);pwdLab = new QLabel(this);loginLab = new QLabel(this);gifLab = new QLabel(this);gifLab->resize(100,100);              //动态图文本大小movie = new QMovie("image/0505.gif"); //创建对象-动态图选择gifLab->setMovie(movie);              //放置动态图movie->start();                       //动态图显示// loginBtn->setText("登录");//登录按钮的起始位置,宽高设置loginBtn->setGeometry(200,200,100,50);//在登录按钮中放置图片loginBtn->setIcon(QIcon(QPixmap(":/image/050302.png")));//图片自适应按钮大小loginBtn->setIconSize(QSize(100,50));//userEdit->setGeometry(200,100,250,20);//pwdEdit->setGeometry(200,150,250,20);//用户编辑框起始位置userEdit->move(200,100);//用户编辑框提示内容信息userEdit->setPlaceholderText("请输入用户名");//用户编辑框设置输入长度userEdit->setMaxLength(11);//密码编辑框起始位置pwdEdit->move(200,150);//密码编辑框提示内容信息pwdEdit->setPlaceholderText("请输入密码");//密码编辑框设置输入长度pwdEdit->setMaxLength(8);//密码编辑框设置输入内容密文显示pwdEdit->setEchoMode(QLineEdit::Password);//logo文本大小//logoLab->resize(100,50);//放置logo图片到logoLab文本中//logoLab->setPixmap(QPixmap(":/image/050301.png").scaled(logoLab->size()));//用户名文本起始位置userLab->move(100,100);//用户名文本内容userLab->setText("用户名");//密码文本起始位置pwdLab->move(100,150);//密码文本内容pwdLab->setText("密码");//登录文本位置loginLab->move(250,40);//登录文本内容loginLab->setText("登录界面");//按钮点击让窗口关闭//connect(loginBtn,SIGNAL(clicked(bool)),this,SLOT(close()));//点击按钮跳转主界面connect(loginBtn,SIGNAL(clicked(bool)),this,SLOT(goLoginSlot()));
}Widget::~Widget()
{}void Widget::goLoginSlot()
{qDebug()<<"点击登录";//获取 编辑框内容QString username = userEdit->text();//qDebug()<<username;QString userpwd = pwdEdit->text();//字符串形式toLatin1转成数组形式for(int i=0;i<userlist.size();i++){//if(strcmp(username.toLatin1(),userlist.at(i)->getUsername().toLatin1()) == 0// &&strcmp(userpwd.toLatin1(),userlist.at(i)->getUserpwd().toLatin1()) == 0)if(username.compare(username,userlist.at(i)->getUsername())==0&&userpwd.compare(userpwd,userlist.at(i)->getUserpwd())==0){qDebug()<<"登录成功";IndexWin *p = new IndexWin;p->show();this->hide();}}
}

main.cpp

#include "widget.h"
#include <QApplication>
#include"indexwin.h"
#include<QGraphicsScene>   //场景
#include<QGraphicsRectItem>//图元
#include<QGraphicsView>    //视图
#include<QTransform>
#include"myview.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);myView w;w.show();return a.exec();
}

【Qt学习】 碰撞检测 图元绘制相关推荐

  1. Qt学习:QtCharts绘制动态曲线,实时更新数据与坐标轴

    前言:很久之前写了这篇文章后一直未进行修改更新,最近重新整理了代码和扩展了使用方式.代码路径见github: https://github.com/LYH-ux/Qt_Projects.git ,下文 ...

  2. Qt (高仿Visio)流程图组件开发(二) 基本图元绘制 图元间连线绘制

    文章目录 本系列目录 前言 一.如何绘制图元 二.两图元之间如何连线 三.如何实现线跟随图元移动 四.线的位置判断 总结 本系列目录 Qt (高仿Visio)流程图组件开发(一) 效果展示及基本开发框 ...

  3. QT学习笔记(十三):绘制图像

    QT学习笔记(十三):绘制图像 paintEvent() 事件源码添加: #include <QPainter> #include <QImage> #include < ...

  4. 【Qt学习】 开机动画设计

    目录 一:开机动画 效果展示 二:开机动画 核心源码 三:项目完整源码分享 一:开机动画 效果展示 图元相互靠近,在碰撞检测后,跳转至登录界面  在登录界面中,输入正确的用户名以及密码  登录成功后, ...

  5. 【Qt学习】 设计视频播放器之界面美化

    目录 一:效果展示 二:源码分享 一:效果展示 开机动画效果 在开机动画后,跳转至登录界面 点击注册按钮,可进入注册界面 登录成功后 进入到视频播放器界面 [初始化默认显示image目录下的所有.pn ...

  6. 【Qt学习】利用数据库单例完成 登录匹配 注册 功能实现

    目录 一:效果展示 二:源码分享 三:数据库查找操作 一:效果展示 注册成功,给出提示  登录成功,给出提示  二:源码分享 mysqlite.h .cpp #ifndef MYSQLITE_H #d ...

  7. 【Qt学习】 登录验证 注册 功能实现

    目录 一:效果展示 二:源码分享 一:效果展示 输入正确用户名密码后,弹出登录成功消息框,并跳转界面  用户名或密码 输入错误,给出错误提示框,需要重新输入用户名密码  注册成功,给出注册成功消息框  ...

  8. QT学习笔记(摘抄)

    QT学习笔记-1.QT主要的对象 说来惭愧学习c++很长时间了一直没有使用c++开发过软件界面 所以现在想认认真真的学习一个c++图形界面框架库 本来想学习Xwidget但是这个资料不大好找 有啥问题 ...

  9. Qt学习笔记之国际化

    国际化的英文表述为Internationalization,通常简写为I18N(首尾字母加中间的字符数),一个应用程序的国际化就是使该应用程序可以让其他国家的用户使用的过程. 1. 相关的Qt类和AP ...

最新文章

  1. nvidia旧版驱动_N卡用户注意:老版驱动存在5个高危漏洞,赶紧更新
  2. 【原创视频教程】学生信息管理系统1--登陆
  3. linux 多线程的基础 交通信号灯学习笔记 :信号详解
  4. 技术分享:看我如何利用Outlook来创建基于电子邮件的持久化后门
  5. 快速问医生接入云信,医患沟通快速搞定,关键是稳定
  6. HDU - 4461 The Power of Xiangqi
  7. java set iterator_Java中的TreeSet的iterator()方法 Java.util.TreeSet.iterator() - Break易站
  8. 生成对抗网络 : LSGAN, WGAN, CGAN, infoGAN, EBGAN, BEGAN, VAE
  9. SQL Server数据库锁的类型、用法及注意事项详解
  10. 播撒汗水,收获希望!
  11. php购物车内物品删除,求助 购物车 用session删除 列表的一条
  12. jquery报.live() is not a function的解决方法
  13. VS2010测试功能之旅:编码的“.NET研究”UI测试(2)-操作动作的录制原理(上)...
  14. Bootstrap 表单控件的状态
  15. leetcode 88 Merge Sorted Array
  16. 【Oracle】数据迁移工具(1):SQL Loader
  17. ios ffmpeg(libfdk-aac) aac encode
  18. 用谷歌浏览器如何下载哔哩哔哩中的视频
  19. 【PS】4组318张超高清叠加层+PS动作图片素材
  20. 中文打字速度测试软件hztest_中文打字速度测试软件官方版

热门文章

  1. Java 通过Office365 服务器发送邮件
  2. 计算机监测可以装win10,如何检测电脑能不能升级Win10?电脑是否符合升级win10?
  3. 模拟用户登录过程,验证用户名、密码和校验码,如果全部正确提示用户登录成功,否则,提示用户相关输入错误
  4. 服务器存储hba卡直连,hba卡直连存储_fc hba卡之间如何连接_hba卡怎么连存储(5)
  5. Wireshark使用技巧之GeoIP显示IP地理位置及经纬度信息
  6. W05 - 999、云小蜜人工智能训练师
  7. linux服务器中毒挖矿,Linux服务器中挖矿病毒 二
  8. 如何把IP-GUARD发布到公网IP来管理全国分公司的终端
  9. 修改Chromium源码实现HEVC/H.265 4K视频播放
  10. 这不是广告!千万不要相信淘宝上卖的CSDN会员!!!