#include "testwidget.h" #include "ui_testwidget.h" #include #include #include TestWidget::TestWidget(QWidget *parent) : QWidget(parent), ui(new Ui::TestWidget) { ui->setupUi(this); connect(&timer,&QTimer::timeout,this,&TestWidget::updateData); timer.setInterval(10); isfailure = false; step = 1; sum=0; QTime time = QTime::currentTime(); qsrand(QTime(0,0,0).secsTo(time)); QTimer::singleShot(10,this,[=](){ setDSize(width()/5,height()/5); }); } TestWidget::~TestWidget() { delete ui; } void TestWidget::setDSize(int width, int height) { Dwidth = width; Dheight = height; } void TestWidget::start() { timer.start(); } void TestWidget::restart() { timer.stop(); bData.clear(); isfailure = false; step = 1; sum = 0; emit value(sum); timer.start(); } void TestWidget::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.fillRect(rect(),Qt::white); painter.setBrush(Qt::black); if(isfailure) { int w = 200; int h = 30; QFont f;f.setPixelSize(32); painter.setFont(f); painter.drawText((width()-w)/2,(height()-h)/2,w,h,Qt::AlignCenter,"你已失败"); }else { BData* d = bData.get(); while(d){ painter.drawRect(d->x,d->y,d->width,d->height); d = d->next; } } } void TestWidget::mousePressEvent(QMouseEvent *event) { QPoint point = event->pos(); if(bData.remove(point.x(),point.y())) { sum++; emit value(sum); //刷新速度 if(sum%10 == 0) step++; } } void TestWidget::keyReleaseEvent(QKeyEvent *event){ if(event->isAutoRepeat()) return; bool _sum = false; switch(event->key()) { case Qt::Key_Q: _sum = bData.remove(Dwidth-1);break; case Qt::Key_W: _sum = bData.remove(2*(Dwidth-1));break; case Qt::Key_E: _sum = bData.remove(3*(Dwidth-1));break; case Qt::Key_R: _sum = bData.remove(4*(Dwidth-1));break; case Qt::Key_T: _sum = bData.remove(5*(Dwidth-1));break; default:break; } if(_sum) { sum++; emit value(sum); //刷新速度 if(sum%10 == 0) step++; } } void TestWidget::updateData() { static int _step = Dheight; // 插入新值 if(_step >= Dheight) { BData *d = new BData; int x = qrand() % 4; bData.init(&d,x*Dwidth,-Dheight,Dwidth,Dheight); bData.insert(d); _step = 0; } // 更新数据 bData.updata(step); //判断失败条件 if(!bData.judge(height())) { isfailure = true; emit failure(); timer.stop(); } _step+=step; //刷新界面 update(); }