From 8eddd1ef9c465180672fe29810b2bf01f1c19079 Mon Sep 17 00:00:00 2001 From: Silas Dohm <silas.dohm@stud.hs-bochum.de> Date: Tue, 9 Aug 2022 12:55:28 +0200 Subject: [PATCH] responsive layout --- cell.cpp | 37 ++++++++++++++++++++++--------------- cell.h | 10 +++++----- window.cpp | 28 +++++++++++++++++----------- window.h | 11 ++++++----- 4 files changed, 50 insertions(+), 36 deletions(-) diff --git a/cell.cpp b/cell.cpp index d01dfde..81f7d55 100644 --- a/cell.cpp +++ b/cell.cpp @@ -17,8 +17,7 @@ Cell::Cell(QWidget *parent) : QWidget(parent) for (char i = 0; i < 9; i++) { m_states[i] = new QPushButton(QString::number(i + 1), this); - m_states[i]->setSizePolicy(QSizePolicy::MinimumExpanding,QSizePolicy::MinimumExpanding); - layout->addWidget(m_states[i],i%3,i/3); + layout->addWidget(m_states[i], i % 3, i / 3); m_states[i]->setStyleSheet("border:none"); connect(m_states[i], SIGNAL(clicked()), mapper, SLOT(map())); mapper->setMapping(m_states[i], i); @@ -27,14 +26,20 @@ Cell::Cell(QWidget *parent) : QWidget(parent) groupBox->setLayout(layout); m_number = new QPushButton(this); - connect(m_number,SIGNAL(clicked()),this,SLOT(un())); + connect(m_number, SIGNAL(clicked()), this, SLOT(un())); m_stackedWidget = new QStackedWidget(this); m_stackedWidget->addWidget(groupBox); m_stackedWidget->addWidget(m_number); - m_stackedWidget->setSizePolicy(QSizePolicy::MinimumExpanding,QSizePolicy::MinimumExpanding); - heightForWidth(this->width()); - setMinimumSize(100,100); - //m_stackedWidget->setFixedSize(70,70); + setMinimumSize(70, 70); +} + +void Cell::resizeEvent(QResizeEvent *event) +{ + QWidget::resizeEvent(event); + m_stackedWidget->setFixedSize(this->size()); + int smallest = this->width() < this->height() ? this->width() : this->height(); + m_number->setStyleSheet("font-size:" + QString::number(smallest / 2) + "px;"); + return; } void Cell::collapse(int x) @@ -46,29 +51,31 @@ void Cell::collapse(int x) } void Cell::removeOption(int x) { - // states[x]->hide(); - if (m_states[x]->isEnabled()) + if (m_blocked[x] == 0) { m_states[x]->setDisabled(true); + m_states[x]->setText(" "); possibleStates--; index.erase(std::find(index.begin(), index.end(), x)); } - m_blocked[x] ++; + m_blocked[x]++; } void Cell::addOption(int x) { - m_blocked[x] --; - //if (!m_states[x]->isEnabled()) - if (m_blocked[x]<1) + m_blocked[x]--; + // if (!m_states[x]->isEnabled()) + if (m_blocked[x] < 1) { + m_states[x]->setText(QString::number(x + 1)); m_states[x]->setDisabled(false); possibleStates++; index.push_back(x); } } -void Cell::un(void){ +void Cell::un(void) +{ collapsed = false; m_stackedWidget->setCurrentIndex(0); - emit(undo(m_number->text().toInt()-1)); + emit(undo(m_number->text().toInt() - 1)); } \ No newline at end of file diff --git a/cell.h b/cell.h index 9d51faa..bd7c76b 100644 --- a/cell.h +++ b/cell.h @@ -2,22 +2,22 @@ #define CELL_H #include <QWidget> -#include <QStackedWidget> - class QPushButton; +class QStackedWidget; class Cell : public QWidget { Q_OBJECT public: explicit Cell(QWidget *parent = 0); - int possibleStates=9; + void resizeEvent(QResizeEvent *event); + int possibleStates = 9; bool collapsed = false; - std::vector<int> index={0,1,2,3,4,5,6,7,8}; + std::vector<int> index = {0, 1, 2, 3, 4, 5, 6, 7, 8}; private: QPushButton *m_states[9]; QPushButton *m_number; - std::array<int,9> m_blocked; + std::array<int, 9> m_blocked; QStackedWidget *m_stackedWidget; signals: diff --git a/window.cpp b/window.cpp index faf8e50..273229d 100644 --- a/window.cpp +++ b/window.cpp @@ -8,7 +8,7 @@ #include <QGridLayout> #include <QHBoxLayout> #include <QVBoxLayout> -#include <QSpacerItem> +#include <QSpacerItem> Window::Window(QWidget *parent) : QWidget{parent} @@ -24,17 +24,24 @@ Window::Window(QWidget *parent) m_slider->setValue(m_delay); connect(m_slider, SIGNAL(valueChanged(int)), this, SLOT(setValue(int))); - QHBoxLayout *horizontalLayout = new QHBoxLayout(this); QVBoxLayout *verticalLayout = new QVBoxLayout(); QGridLayout *layout = new QGridLayout(); + m_spacer[0] = new QSpacerItem(8, 8, QSizePolicy::Minimum, QSizePolicy::Fixed); + m_spacer[1] = new QSpacerItem(8, 8, QSizePolicy::Minimum, QSizePolicy::Fixed); + m_spacer[2] = new QSpacerItem(8, 8, QSizePolicy::Minimum, QSizePolicy::Expanding); + verticalLayout->addItem(m_spacer[2]); + verticalLayout->addWidget(m_solveButton); verticalLayout->addWidget(m_slider); verticalLayout->addWidget(m_clearButton); - horizontalLayout->addLayout(layout,5); - horizontalLayout->addLayout(verticalLayout,1); + horizontalLayout->addLayout(layout, 5); + horizontalLayout->addLayout(verticalLayout, 1); + layout->addItem(m_spacer[0], 3, 3); + layout->addItem(m_spacer[1], 7, 7); + layout->setSpacing(0); int dx = 0; int dy = 0; @@ -43,9 +50,8 @@ Window::Window(QWidget *parent) for (int y = 0; y < 9; y++) { m_cell[x + y * 9].setParent(this); - layout->addWidget(&m_cell[x+y*9],y,x); - - //connecting signals & slots + layout->addWidget(&m_cell[x + y * 9], y + y / 3, x + x / 3); + // connecting signals & slots for (int d = 0; d < 9; d++) // rows and columns { connect(&m_cell[x + y * 9], SIGNAL(update(int)), &m_cell[x + d * 9], SLOT(removeOption(int))); @@ -60,7 +66,7 @@ Window::Window(QWidget *parent) { for (int y1 = b; y1 < b + 3; y1++) { - if(x1 == x || y1 == y) + if (x1 == x || y1 == y) continue; connect(&m_cell[x + y * 9], SIGNAL(update(int)), &m_cell[x1 + y1 * 9], SLOT(removeOption(int))); @@ -75,7 +81,7 @@ void Window::solveButtonClicked() { std::list<History *> hist; bool backtracking = false; - srand(time(NULL)); //random seed + srand(time(NULL)); // random seed while (1) { repaint(); // draw cells again @@ -89,8 +95,8 @@ void Window::solveButtonClicked() continue; } backtracking = false; - int choiceNr = rand() % hist.back()->index.size(); // choose a random number; - repaint(); // draw cells again + int choiceNr = rand() % hist.back()->index.size(); // choose a random number; + repaint(); // draw cells again QThread::msleep(m_delay); hist.back()->cell->collapse(hist.back()->index[choiceNr]); // collapse cell with chosen number; std::vector<int>::iterator it; diff --git a/window.h b/window.h index 0f240a1..f05749a 100644 --- a/window.h +++ b/window.h @@ -6,6 +6,7 @@ #include <QProgressBar> #include <QSlider> #include "cell.h" +class QSpacerItem; class Window : public QWidget { Q_OBJECT @@ -15,20 +16,20 @@ public: private: QPushButton *m_clearButton; QPushButton *m_solveButton; - QPushButton *grid[9][9]; - QProgressBar *m_progressBar; QSlider *m_slider; std::array<Cell, 81> m_cell; int m_delay = 300; + QSpacerItem *m_spacer[3]; struct History { Cell *cell; std::vector<int> index; - History(Cell *c, std::vector<int> in,int choice) + History(Cell *c, std::vector<int> in, int choice) { cell = c; - for(int i=0;i<in.size();i++){ - if(i == choice) + for (int i = 0; i < in.size(); i++) + { + if (i == choice) continue; index.push_back(in[i]); } -- GitLab