为了能很好地理解昨天跑出来的这个别人的程序,花了点时间对他做了个注释。今天由于做了个核酸,起太早了,有点困,又回寝室补了个觉,做的不多,明天继续。
#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);
}
感觉这个代码块不好看,换个地方写,换到腾讯云