程序效果图
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();
}