From 7bd5f964de24b976b81dcd7b3bfdc9b2a091e30d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20R=C3=B6hling?= <Markus.Roehling@kontron.de> Date: Wed, 8 May 2019 10:04:56 +0200 Subject: [PATCH] Change that only elements on the display diagonal needed to be touched to pass the test. --- README | 3 +++ graphicalbutton.cpp | 6 +++--- graphicalbutton.h | 8 +++++--- mainwindow.cpp | 31 +++++++++++++++++++++---------- mainwindow.h | 2 +- 5 files changed, 33 insertions(+), 17 deletions(-) create mode 100644 README diff --git a/README b/README new file mode 100644 index 0000000..b74c528 --- /dev/null +++ b/README @@ -0,0 +1,3 @@ +Teilt den Bildschirm in Quadrate ein, die beim erstmaligen Berühren die Farbe wechseln. Dabei werden die Quadrate, die auf der Displaydiagonalen von links oben nach rechts unten liegen rot, alle übrigen blau gefärbt, bei registrierter Berührung werden sie grün. +Der Test beendet sich selbst, wenn alle Quadrate auf der Diagonalen mindestens einmal berührt wurden und sich damit grün gefärbt haben. +Durch Mitgabe einer Zahl beim Programmaufruf kann man die Größe der Quadrate in Pixeln angeben, standardmäßig sind 40 Pixel eingestellt. diff --git a/graphicalbutton.cpp b/graphicalbutton.cpp index 0ae9a0d..8deab52 100644 --- a/graphicalbutton.cpp +++ b/graphicalbutton.cpp @@ -1,11 +1,11 @@ #include "graphicalbutton.h" -GraphicalButton::GraphicalButton(QWidget *parent) : QLabel(parent) +GraphicalButton::GraphicalButton(QWidget *parent,bool _onDiagonal) : QLabel(parent), onDiagonal(_onDiagonal) { - setStyleSheet("background-color: red"); + setStyleSheet(QString("background-color:")+(onDiagonal ? QString("red") : QString("blue"))); } -void GraphicalButton::changeColor() +void GraphicalButton::changeColour() { setStyleSheet("background-color: green"); touched = true; diff --git a/graphicalbutton.h b/graphicalbutton.h index e019ff5..0d93df6 100644 --- a/graphicalbutton.h +++ b/graphicalbutton.h @@ -8,11 +8,13 @@ class GraphicalButton : public QLabel Q_OBJECT public: - GraphicalButton(QWidget *parent = 0); - bool colored(){return touched;} - void changeColor(); + GraphicalButton(QWidget *parent = 0,bool _onDiagonal = false); + bool coloured(){return touched;} + bool isOnDiagonal(){return onDiagonal;} + void changeColour(); private: bool touched = false; + bool onDiagonal = false; }; #endif // GRAPHICALBUTTON_H diff --git a/mainwindow.cpp b/mainwindow.cpp index 82b7322..c9b226b 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -2,6 +2,7 @@ #include <QScreen> #include <QGuiApplication> #include <QMouseEvent> +#include <QLineF> #include <QDebug> MainWindow::MainWindow(int val, QWidget *parent) : QMainWindow(parent), edge(val) @@ -11,21 +12,30 @@ MainWindow::MainWindow(int val, QWidget *parent) : QMainWindow(parent), edge(val setFixedSize(screenSize); ammX = int (screenSize.width() /edge); ammY = int (screenSize.height()/edge); - coloredField = 0; for(int i = 0; i < ammX; i++) for(int j = 0; j < ammY; j++) { - GraphicalButton *newBut = new GraphicalButton(this); + bool intersected = false; + for(int k = 0; k < 2; k++) + { + QLineF diag(0,0,screenSize.width(),screenSize.height()) ; + QPointF* intersectPoint = 0; + QLineF::IntersectType intersect = diag.intersect(QLineF((i+0.2)*edge,(j+0.2)*edge,(i+0.8-0.6*k)*edge,(j+0.2+0.6*k)*edge),intersectPoint); + if(intersect == QLineF::BoundedIntersection) {intersected = true; fieldsOnDiag++; break;} + } + GraphicalButton *newBut = new GraphicalButton(this,intersected); newBut->setGeometry(i*edge,j*edge,edge,edge); buttons.push_back(newBut); } text = new QLabel(this); text->setGeometry(0,0,screenSize.width(),screenSize.height()); - text->setText("Bitte mit dem Finger über den Bildschirm fahren, bis alle Rechtecke grün sind."); + text->setText(QString("Bitte mit dem Finger über den Bildschirm fahren,")+(screenSize.width()<600 ? "\n":" ")+QString("bis alle roten Rechtecke grün sind.")); + text->setStyleSheet("color: rgba(255, 255, 255, 1.0);"); text->setAlignment(Qt::AlignCenter); - text->setFont(QFont("Arial",12)); + text->setFont(QFont("Arial",screenSize.width() < 600 ? 10: (screenSize.width() > 1300 ? 14 : 12))); timer = new QTimer(this); timer->setInterval(5000); + timer->setSingleShot(true); connect(timer,SIGNAL(timeout()),this,SLOT(quit())); } @@ -40,18 +50,19 @@ void MainWindow::mouseMoveEvent(QMouseEvent *event) int x = event->x(); int y = event->y(); int element = x/edge*ammY+ y/edge; - if(element <= ammX*ammY) + if(element < ammX*ammY && x <= edge*ammX && y <= edge*ammY) { GraphicalButton* but = buttons[element]; - if(!but->colored()) + if(!but->coloured()) { - but->changeColor(); - coloredField++; + but->changeColour(); + colouredField++; + if(but->isOnDiagonal()) colouredFieldonDiag++; } - if(coloredField == ammX*ammY) + if(colouredField == ammX*ammY || colouredFieldonDiag == fieldsOnDiag) { text->setText("Test beendet."); - timer->start(); + if(!timer->isActive()) timer->start(); } } } diff --git a/mainwindow.h b/mainwindow.h index e403fd6..28b4eae 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -14,7 +14,7 @@ public: MainWindow(int val, QWidget *parent = 0); ~MainWindow(); private: - int ammX,ammY,edge,coloredField; + int ammX, ammY, edge, colouredField = 0, colouredFieldonDiag = 0, fieldsOnDiag = 0; QLabel *text; QTimer *timer; std::vector<GraphicalButton*> buttons; -- GitLab