首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >毕设-Qt开发虚拟VR实验室-第六天-程序理解

毕设-Qt开发虚拟VR实验室-第六天-程序理解

原创
作者头像
Siyue
发布2022-03-12 22:11:26
发布2022-03-12 22:11:26
1K0
举报
文章被收录于专栏:qt+irrlichtqt+irrlicht

为了能很好地理解昨天跑出来的这个别人的程序,花了点时间对他做了个注释。今天由于做了个核酸,起太早了,有点困,又回寝室补了个觉,做的不多,明天继续。

代码语言:javascript
复制
#include "irrlichthelloworld.h"
#include <QVBoxLayout>
#include <QPushButton>
#include <QSlider>
#include <QLabel>
#ifdef _IRR_WINDOWS_
#pragma comment(lib, "Irrlicht.lib")
#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
#endif

IrrlichtHelloWorld::IrrlichtHelloWorld(QWidget *parent)//构造函数?构造一下qt的窗口长什么样
	: QMainWindow(parent)
{
	/*
	相较于QWidget,QMainWindow会创建一个窗口,从外到内依次是菜单栏、状态栏、工具栏、停靠窗口、中心窗口。
	到时候需要考虑一下垂直与水平嵌套布局的话该怎么写代码
	*/
	m_thread = NULL;
	m_disWnd = new QWidget(this);
	m_disWnd->setMinimumSize(400,300);//QT设置窗体的大小(只是里面的画面,不是总的窗口),min只是最小窗口,还有最大化选项
	m_disWnd->setStyleSheet(QString("background-color:rgb(0,47,167)"));//设置背景,边框,字体一类的

	QVBoxLayout* main_layout = new QVBoxLayout();//QVBoxLayout:在垂直的方向上排列控制按钮,随按钮增多改变位置;改成QHBoxLayout就是水平了
	main_layout->addWidget(m_disWnd);//不知道干嘛用的,通过注释可以看到,有了这个才会有显示画面的窗口,所以必须得写

	m_start = new QPushButton(QStringLiteral("显示IrrLicht引擎输出"));//一个按钮//QStringLiteral 宏可以在编译期把代码里的常量字符串 str 直接构造为 QString 对象
	main_layout->addWidget(m_start);
	connect(m_start,SIGNAL(clicked()),this,SLOT(showWnd()));//将m_start这个按钮,同this这个窗口的显示函数联系起来,方式是鼠标点击clicked

	m_stop = new QPushButton(QStringLiteral("关闭IrrLicht引擎输出"));//第二个按钮
	main_layout->addWidget(m_stop);
	m_stop->setEnabled(false);//当setEnabled为false时,此关闭按钮不可点击;//setEnabled为判断图形是否被读取
	connect(m_stop,SIGNAL(clicked()),this,SLOT(closeWnd()));

	QSlider* x_slider = new QSlider(Qt::Horizontal,this);//QSlider是滑动条控件;Horizontal是水平滑动条,Vertical是竖直
	QSlider* y_slider = new QSlider(Qt::Horizontal,this);
	QSlider* z_slider = new QSlider(Qt::Horizontal,this);
	x_slider->setMinimum(0);//滑动条长度设置,只是数值范围,不是显示的物理大小
	x_slider->setMaximum(100);
	y_slider->setMinimum(0);
	y_slider->setMaximum(100);
	z_slider->setMinimum(0);
	z_slider->setMaximum(100);
	connect(x_slider,SIGNAL(valueChanged(int)),this,SLOT(camer_x_change(int)));
	connect(y_slider,SIGNAL(valueChanged(int)),this,SLOT(camer_y_change(int)));
	connect(z_slider,SIGNAL(valueChanged(int)),this,SLOT(camer_z_change(int)));
	x_slider->setValue(50);//显示初始的滑动条位置
	y_slider->setValue(80);
	z_slider->setValue(10);
	main_layout->addWidget(new QLabel(QStringLiteral("摄像机位置:")));//QLabel只是单纯的文字框,QPushButton是能点击的按钮
	main_layout->addWidget(new QLabel(QStringLiteral("X轴位置:")));
	main_layout->addWidget(x_slider);
	main_layout->addWidget(new QLabel(QStringLiteral("Y轴位置:")));
	main_layout->addWidget(y_slider);
	main_layout->addWidget(new QLabel(QStringLiteral("Z轴位置:")));
	main_layout->addWidget(z_slider);
	QWidget* centerWidget = new QWidget(this);
	centerWidget->setLayout(main_layout);//哦~~,如果直接使用QHBoxLayout、QVBoxLayout等进行布局会报错,因为不允许对mainwindow直接布局,所以要写这三行,不管是否理解,知道作用就行了。
	setCentralWidget(centerWidget);
	
}

IrrlichtHelloWorld::~IrrlichtHelloWorld()//析构函数,就是删除对象,防止占用内存
{
	if (m_thread)
	{
		m_thread->stop();
		delete m_thread;
	}
}

void IrrlichtHelloWorld::showWnd()
{
	m_start->setEnabled(false);//两极反转!
	m_stop->setEnabled(true);
	m_thread = new QIrrLichtThread(m_disWnd->winId());//跳转到qIrrLichtthread.cpp里的QIrrLichtThread函数里了,展示irr的helloworld工程,这部分用到了irr引擎,明天再说了
	                                           //winId()外部进程获取到qt窗口里
	                                           //m_thread也是一个窗口,只是把m_disWnd指向的画面投射到了这个窗口里
	m_thread->start();
}

void IrrlichtHelloWorld::closeWnd()
{
	if (m_thread == NULL) return;//根本没打开,所以就不能关闭,虽然之前的按钮也不能按,但必须做好提前量
	m_start->setEnabled(true);
	m_stop->setEnabled(false);
	m_thread->stop();
	m_disWnd->repaint();
	//m_disWnd->setStyleSheet(QString("backgroud-color:rgb(0,0,0)"));
}


void IrrlichtHelloWorld::camer_x_change( int value )
{
	if (m_thread == NULL) return;
	vector3df pos = m_thread->camer_pos();
	pos.X = value - 50;
	m_thread->camer_pos(pos);
}

void IrrlichtHelloWorld::camer_y_change( int value )
{
	if (m_thread == NULL) return;
	vector3df pos = m_thread->camer_pos();
	pos.Y = value - 50;
	m_thread->camer_pos(pos);
}

void IrrlichtHelloWorld::camer_z_change( int value )
{
	if (m_thread == NULL) return;
	vector3df pos = m_thread->camer_pos();
	pos.Z = value - 50;
	m_thread->camer_pos(pos);
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档