QT小程序:冒泡排序法

程序效果图

BubbleSort.h文件代码

#pragma once

#include <QtWidgets/QWidget>
#include "ui_BubbleSort.h"
#include <QLabel>

class BubbleSort : public QWidget
{
	Q_OBJECT

public:
	BubbleSort(QWidget *parent = Q_NULLPTR); 
private:

	Ui::BubbleSortClass ui;

	std::vector<std::vector<int>>  vectorList; //二维Vector容器数组

	void init();
	
	QTimer* timer;

	int timerNum;      //时间间隔
	
	bool isStartFlag;  //是否开始进行排序

	bool isHoldFlag;  //排序完后是否保持图画

	int transNum;    //记录已经绘制次数

	void paintEvent(QPaintEvent* event) override;

public slots:

	void on_start_btn_clicked();
	
	
};

BubbleSort.cpp代码段

#include "BubbleSort.h"
#include <QTime>
#include <QDebug>
#include <QTimer>
#include <QPainter>
#include <QRect>

#include <iostream>
using namespace std;

BubbleSort::BubbleSort(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);
	init();
	
}

void BubbleSort::init()
{	
	
	setWindowTitle(QStringLiteral("冒泡排序法"));
	isStartFlag = false;
	isHoldFlag = false;
	resize(600, 300);
	timer = new QTimer(this);
	connect(timer, SIGNAL(timeout()), this, SLOT(update()));
	
}


void BubbleSort::on_start_btn_clicked()
{
	transNum = 0;
	vectorList.clear();

	qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
	std::vector<int> listRand;
	//获得12个随机数
	for (int i = 0; i < 12; ++i)
	{
		int nTestNum = qrand() % 100;
		listRand.push_back(nTestNum);
	}

	//把1维vetor放进2维的vector数组中
	vectorList.push_back(listRand);


	//冒泡排序,用二维数组保存,
	for (int i = 0; i < listRand.size()-1; ++i)
	{
		for (int j = 0; j < listRand.size()-1 ; ++j)
		{
			 if (listRand[j]<listRand[j + 1])
			{
				swap(listRand[j], listRand[j + 1]);
				//每次排序后的一维数组,放进二维数组中
				vectorList.push_back(listRand);
				
			}

		}
	}
	isStartFlag = true;
	isHoldFlag = false;
	qDebug() << vectorList.size();
	//启用定时器
	timerNum = ui.time_edit->text().toInt();
	timer->start(timerNum);
}

void BubbleSort::paintEvent(QPaintEvent* event)
{
	//设置填充颜色
	QColor hourColor(0, 255, 0);
	QPainter painter(this);
	painter.setRenderHint(QPainter::Antialiasing);//渲染:抗锯齿
	painter.setBrush(hourColor);
	painter.save();

	if (isStartFlag)
	{
		for (int k = 0; k < 12; k++)
		{
			//画数值矩形
			QRect rect = QRect(30 * k + 20, 50, 20, vectorList[transNum][k] * 2);
			painter.drawRect(rect);
			//画数值
			QString text = QString("%1").arg(vectorList[transNum][k]);
			painter.drawText(30 * k + 20, 35, text);
			//画序号
			painter.drawText(30 * k + 20, 15, QString("%1").arg(k));
		}
		transNum++;
		qDebug() << vectorList[transNum];
		if (transNum == vectorList.size()-1)
		{
			isStartFlag = false;
			isHoldFlag = true;
		}
	}

	//排序完后,继续保持画面
	if (isHoldFlag)
	{
		for (int k = 0; k < 12; k++)
		{
			QRect rect = QRect(30 * k + 20, 50, 20, vectorList[vectorList.size() - 1][k] * 2);
			painter.drawRect(rect);
			QString text = QString("%1").arg(vectorList[vectorList.size() - 1][k]);
			painter.drawText(30 * k + 20, 35, text);
			painter.drawText(30 * k + 20, 15, QString("%1").arg(k));
			painter.drawText(width()-25, height()-10, QString("OK"));
		}
	}
	
	painter.restore();
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值