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();
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章