当前位置: 首页 > news >正文

QT三维图形3

我们现在要设计一个滑动条,可以通过滑动来实现立方体位置和边框长度的改变。

因为立方体的长宽都是小数,普通的进度条难以实现,这里我们封装一个double类型的进度条:

class QDoubleSlider : public QSlider

然后在里面定义函数:

	void setRange(double Min, double Max);
	void setMinimum(double Min);
	double minimum() const;
	void setMaximum(double Max);
	double maximum() const;
	double value() const;

以及信号和槽:

public slots:
	void setValue(int value);
public slots:
	void setValue(double Value, bool BlockSignals = false);
signals:
	void valueChanged(double Value);
signals:
	void rangeChanged(double Min, double Max);

这里面的修改应该是借助过别人的程序,记得是github某个程序上截取出来的,首先表示感谢。因为原代码也没有附带任何版权说明,我也忘了是谁的程序了,如果作者看到了请联系我。

函数:

QDoubleSlider::QDoubleSlider(QWidget* pParent) :
	QSlider(pParent),
	m_Multiplier(10000.0)
{
	connect(this, SIGNAL(valueChanged(int)), this, SLOT(setValue(int)));

	setSingleStep(1);

	setOrientation(Qt::Horizontal);
	setFocusPolicy(Qt::NoFocus);
}

void QDoubleSlider::setValue(int Value)
{
	
	emit valueChanged((double)Value / m_Multiplier);
}

void QDoubleSlider::setValue(double Value, bool BlockSignals)
{
	QSlider::blockSignals(BlockSignals);

	QSlider::setValue(Value * m_Multiplier);

	if (!BlockSignals)
		emit valueChanged(Value);

	QSlider::blockSignals(false);
}

void QDoubleSlider::setRange(double Min, double Max)
{
	QSlider::setRange(Min * m_Multiplier, Max * m_Multiplier);

	emit rangeChanged(Min, Max);
}

void QDoubleSlider::setMinimum(double Min)
{
	QSlider::setMinimum(Min * m_Multiplier);

	emit rangeChanged(minimum(), maximum());
}

double QDoubleSlider::minimum() const
{
	return QSlider::minimum() / m_Multiplier;
}

void QDoubleSlider::setMaximum(double Max)
{
	QSlider::setMaximum(Max * m_Multiplier);

	emit rangeChanged(minimum(), maximum());
}

double QDoubleSlider::maximum() const
{
	return QSlider::maximum() / m_Multiplier;
}

double QDoubleSlider::value() const
{
	int Value = QSlider::value();
	return (double)Value / m_Multiplier;
}

使用的话,就跟int类型的QSlider一样就行了,只是它可以设置浮点数量。精度是1/10000。

我们定义两个类,分别调节立方体坐标值和立方体的边长:

class My3DHalfBoundary : public QGroupBox
class My3DCentralPoint : public QGroupBox

注意第一个边界也是定义的半边界。

中心点比较麻烦,因为大家设想一下,如果边界变了,中心点的运动范围也得变,但是如果中心点位置变了,边界的范围就不会变。所以我们先设计边界长度类:

class My3DHalfBoundary : public QGroupBox {
	Q_OBJECT
	
public:
	My3DHalfBoundary(QWidget * parent = Q_NULLPTR);
	~My3DHalfBoundary();

	QDoubleSlider *xSlider4HalfBnd;
	QDoubleSlider *ySlider4HalfBnd;
	QDoubleSlider *zSlider4HalfBnd;
	QLabel *xLabelHalfBnd;
	QLabel *yLabelHalfBnd;
	QLabel *zLabelHalfBnd;

private:
	
};

没有设计任何信号的槽。

#include "my3dhalfboundary.hpp"
#include <qgridlayout.h>
#include <qopenglwindow.h>
extern GLfloat centralRectPos[3];
extern GLfloat halfBoundaries[3];
My3DHalfBoundary::My3DHalfBoundary(QWidget * parent) : QGroupBox(parent) {
	setTitle("Boundary Setting");
	QGridLayout *gridlayout = new QGridLayout(this);
	xSlider4HalfBnd = new QDoubleSlider;
	ySlider4HalfBnd = new QDoubleSlider;
	zSlider4HalfBnd = new QDoubleSlider;
	xLabelHalfBnd = new QLabel("xBound: ");
	yLabelHalfBnd = new QLabel("yBound: ");
	zLabelHalfBnd = new QLabel("zBound: ");
	gridlayout->addWidget(xLabelHalfBnd, 0, 0);
	gridlayout->addWidget(yLabelHalfBnd, 1, 0);
	gridlayout->addWidget(zLabelHalfBnd, 2, 0);
	gridlayout->addWidget(xSlider4HalfBnd, 0, 1);
	gridlayout->addWidget(ySlider4HalfBnd, 1, 1);
	gridlayout->addWidget(zSlider4HalfBnd, 2, 1);


	xSlider4HalfBnd->setRange(0.02, 0.5);
	xSlider4HalfBnd->setValue(halfBoundaries[0]);
	ySlider4HalfBnd->setRange(0.02, 0.5);
	ySlider4HalfBnd->setValue(halfBoundaries[1]);
	zSlider4HalfBnd->setRange(0.02, 0.5);
	zSlider4HalfBnd->setValue(halfBoundaries[2]);

}

My3DHalfBoundary::~My3DHalfBoundary() {
	

}

在构造函数中,我们设置边长的变化范围是0.02——0.5,太小了也没有什么意义。

这个类很简单。但是下一节要说的关于中心点的类就有点难了。

相关文章:

  • QT三维图形4
  • icache的方面以及使用
  • cmp bne 以及sub指令的详解
  • 关于ARM Cortex a 系列的看门狗定时器
  • C语言之 认识可变参数
  • ARM cortex a 的SDRAM (DDR)
  • C语言 之递归函数
  • C语言 之建立静态链接库
  • ARM的PWM定时器1
  • RTC闹钟的中断处理方法以及程序设计
  • altium designer 制作元器件封装库
  • VTK的Mapper
  • VTK交互系统 1 交互模式入门
  • VTK显示像素图
  • VTK交互系统 2 交互器样式
  • 《剑指offer》分解让复杂问题更简单
  • Akka系列(七):Actor持久化之Akka persistence
  • ES2017异步函数现已正式可用
  • Javascript 原型链
  • JS函数式编程 数组部分风格 ES6版
  • Python连接Oracle
  • React-Native - 收藏集 - 掘金
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 程序员最讨厌的9句话,你可有补充?
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 批量截取pdf文件
  • 让你的分享飞起来——极光推出社会化分享组件
  • 如何设计一个微型分布式架构?
  • 小程序 setData 学问多
  • 协程
  • 学习HTTP相关知识笔记
  • 源码安装memcached和php memcache扩展
  • 智能网联汽车信息安全
  • 第二十章:异步和文件I/O.(二十三)
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 浅谈sql中的in与not in,exists与not exists的区别
  • "无招胜有招"nbsp;史上最全的互…
  • #if和#ifdef区别
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (七)Java对象在Hibernate持久化层的状态
  • (七)理解angular中的module和injector,即依赖注入
  • (五)MySQL的备份及恢复
  • (转)ABI是什么
  • (转载)OpenStack Hacker养成指南
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .NET Reactor简单使用教程
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .Net语言中的StringBuilder:入门到精通
  • .NET中的Exception处理(C#)
  • .net中应用SQL缓存(实例使用)