From 54865cc1347f8a437a3fae657753eba5697cf8dc Mon Sep 17 00:00:00 2001 From: Andrey Zotov Date: Sun, 24 Mar 2024 12:59:46 +0500 Subject: [PATCH 01/12] gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fad7aed --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.vscode +WidgetMovement/default \ No newline at end of file From f3dcb6f73a76940fa673cdf3ffcb8e7b3268c8c9 Mon Sep 17 00:00:00 2001 From: Andrey Zotov Date: Sun, 24 Mar 2024 13:57:20 +0500 Subject: [PATCH 02/12] Buttons generation --- WidgetMovement/mainwindow.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/WidgetMovement/mainwindow.cpp b/WidgetMovement/mainwindow.cpp index d5ea339..33e8541 100644 --- a/WidgetMovement/mainwindow.cpp +++ b/WidgetMovement/mainwindow.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "mainwindow.h" @@ -7,8 +8,18 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { resize(300, 600); -/// Your code here... - + m_timer = new QTimer(this); + m_timer->start(1000); + connect(m_timer, &QTimer::timeout, m_timer, [this]() + { + constexpr int minTimeMs = 100, maxTimeMs = 1000; + this->m_timer->setInterval(QRandomGenerator::global()->bounded(minTimeMs, maxTimeMs)); + auto button = new QPushButton(this); + auto windowSize = this->size(); + auto buttonSize = QSize(10, 10); + auto position = QPoint(QRandomGenerator::global()->bounded(0, windowSize.width()-buttonSize.width()), 100); + button->setGeometry(QRect(position, buttonSize)); + button->show(); }); } MainWindow::~MainWindow() From 4c499f584f6e3cfd5f20482dfd7845f274053504 Mon Sep 17 00:00:00 2001 From: Andrey Zotov Date: Sun, 24 Mar 2024 14:24:21 +0500 Subject: [PATCH 03/12] Buttons movement --- .clang-format | 295 ++++++++++++++++++++++++++++++++++ WidgetMovement/mainwindow.cpp | 35 ++-- 2 files changed, 317 insertions(+), 13 deletions(-) create mode 100644 .clang-format diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..5b8dc14 --- /dev/null +++ b/.clang-format @@ -0,0 +1,295 @@ +--- +Language: Cpp + +#https://releases.llvm.org/14.0.0/tools/clang/docs/ClangFormatStyleOptions.html + +#Особый отступ для модификаторов видимости (на уровне с 'class') +AccessModifierOffset: -4 + +#Выравнивание аргументов после открытия скобки +AlignAfterOpenBracket: Align + +#Выравнивание элементов в {}, когда несколько строк друг под другом +#Настройка забирает гибкость, пока от нее отказываемся +AlignArrayOfStructures: None + +#Выравнивание после =, когда несколько строк друг под другом +AlignConsecutiveAssignments: None + +#Выравнивание значений битовых полей +AlignConsecutiveBitFields: None + +#Выравнивание деклараций имен, когда несколько строк друг под другом +AlignConsecutiveDeclarations: None + +#Выравнивание значений дефайнов, когда несколько строк друг под другом +AlignConsecutiveMacros: AcrossComments + +#Выравнивание бэкслешей в макросах +AlignEscapedNewlines: Left + +#Выравнивание операторов (так себе настройка) +AlignOperands: DontAlign + +#Выравнивание комментов, когда несколько строк друг под другом +AlignTrailingComments: true + +#Если вызов функции или список инициализаторов в фигурных скобках +#не помещается на одной строке, разрешите помещать все аргументы +# на следующую строку, даже если BinPackArguments имеет значение false. +AllowAllArgumentsOnNextLine: false + +#Если объявление функции не помещается на одной строке, разрешите +# помещать все аргументы на следующую строку, даже если +# BinPackArguments имеет значение false. +AllowAllParametersOfDeclarationOnNextLine: false + +#Если в {} нет выражений, то закрывающая скобка рядом с открывающей, без переноса: {} +AllowShortBlocksOnASingleLine: Empty + +#Запрещаем мультилайн в кейзах свича +AllowShortCaseLabelsOnASingleLine: false + +#Запрещаем мультилайн в enum +AllowShortEnumsOnASingleLine: false + +#В классах однострочные функции всегда single-line +#Свободные функции всегда НЕ single-line +#Функции без тела всегда single-line +AllowShortFunctionsOnASingleLine: Inline + +#Запрет single-line if-конструкций +AllowShortIfStatementsOnASingleLine: Never + +#Можно воротить лямбды как душе угодно +AllowShortLambdasOnASingleLine: All + +#Запрет single-line циклов +AllowShortLoopsOnASingleLine: false + +#Разрыв строки после возвращаемого типа объявляемой функции +AlwaysBreakAfterReturnType: None + +#Если true, всегда разрывать строку перед многострочными строковыми литералами. +AlwaysBreakBeforeMultilineStrings: false + +#Всегда перенос строки после обьявления шаблона +AlwaysBreakTemplateDeclarations: Yes + +#DisableFormat: false + +#Если false, аргументы вызова функции будут либо все в одной строке, +#либо будут иметь по одной строке каждый. +# ВАЖНО! с true получается гибкая настройка +BinPackArguments: true + +#Если false, параметры объявления функции или определения функции будут +#либо все в одной строке, либо будут иметь по одной строке каждый. +# ВАЖНО! с true получается гибкая настройка +BinPackParameters: true + +#Добавляет по одному пробелу с каждой стороны : (для битового поля) +BitFieldColonSpacing: Both + +#Правило переноса строки перед фигурными скобками (и не только) +BreakBeforeBraces: Custom +BraceWrapping: + AfterEnum: true + AfterStruct: true + AfterFunction: true + AfterCaseLabel: true + AfterClass: true + AfterControlStatement: true + AfterNamespace: true + AfterUnion: true + AfterExternBlock: true + BeforeElse: true + BeforeCatch: true + BeforeLambdaBody: false + BeforeWhile: false + SplitEmptyFunction: false + SplitEmptyRecord: false + SplitEmptyNamespace: true + +#При переносе операторы с левого края, но = остается на своей строке +BreakBeforeBinaryOperators: NonAssignment + +#Если true, концепт будет помещен на новую строку. +BreakBeforeConceptDeclarations: true + +#Операторы тернарного операторы с левого края (при переносе) +BreakBeforeTernaryOperators: true + +#При инициализации в конструкторе ':' и ',' не переносятся +BreakConstructorInitializers: AfterColon + +#При наследовании классов ':' и ',' не переносятся +BreakInheritanceList: AfterComma + +#Разрешить разрыв строковых литералов при форматировании. +BreakStringLiterals: false + +#Ограничение по ширине исходников +ColumnLimit: 0 + +#Если true, последовательные объявления пространств имен будут находиться в одной строке. +#Если false, каждое пространство имен объявляется в новой строке. +CompactNamespaces: false + +#Количество символов, используемых для отступа в списках инициализаторов конструктора, +#а также в списках наследования. +ConstructorInitializerIndentWidth: 4 + +#Отступ от продолжения выражения после переноса строки +#Используется при выравнивании длинных макросов по левому краю +ContinuationIndentWidth: 0 + +#Пробелы в { 1, 2, 3 } перед первым и после последнего элемента +Cpp11BracedListStyle: false + +#Если true, анализирует отформатированный файл на предмет +#наиболее распространенного выравнивания & и * +DerivePointerAlignment: false + +#Если нужно полностью отключить форматирование (зачем??) +DisableFormat: false + +#Пропуск строки ПОСЛЕ модификатора доступа (например, public:) +EmptyLineAfterAccessModifier: Never + +#Пропуск строки ДО модификатора доступа (например, public:) +EmptyLineBeforeAccessModifier: LogicalBlock + +#Экспериментировать с экспериментальными настройками не будем +#ExperimentalAutoDetectBinPacking: false + +#Комменты после namespace +FixNamespaceComments: true + +#Сортировка инклюдов - каждая секция (разделенная пустой строкой) сортируется лексикографически +IncludeBlocks: Preserve + +#Сложная ненужная настройка отступов модификаторов доступа - при true +# будет игнорировать AccessModifierOffset +IndentAccessModifiers: false + +#Дополнительный отступ у {} после case: в switch-операторе. Выглядит страшно, поэтому false +IndentCaseBlocks: false + +#Отступ у ключевого слова case в switch. при false case и switch на одном уровне +IndentCaseLabels: false + +#Выравнивание тела extern-секции +IndentExternBlock: NoIndent + +#Выравнивание goto лэйблов +IndentGotoLabels: false + +#Выравнивание вложенных препроцессорных директив +IndentPPDirectives: None + +#Сделать отступ для пункта required в шаблоне +IndentRequires: false + +#Отступы, пробелов +IndentWidth: 4 + +#При длинной сигнатуре функции можно перенести имя на новую строку без доп. отступов +IndentWrappedFunctionNames: false + +#Делать пропуск строки после начала блока { } +KeepEmptyLinesAtTheStartOfBlocks: false + +#Выравнивание тела лямбды +LambdaBodyIndentation: OuterScope + +#Максимум пустых строк подряд +MaxEmptyLinesToKeep: 1 + +#Отступы у тел вложенных namespace's +NamespaceIndentation: None + +#Количество столбцов, используемых для отступов операторов препроцессора. +#Настройка не используется +#PPIndentWidth: 10 + +#Порядок в списке инициализации. BinPack дает гибкость в настройке +PackConstructorInitializers: BinPack + +#PenaltyBreak настройки непонятно че делают вообще.. не используется + +#Выравнивание * и & к типу 'int* num' +PointerAlignment: Left + +#Не используется: +#QualifierAlignment +#QualifierOrder +#RawStringFormats + +#Выравнивание ссылки, как и указателя: int& obj +ReferenceAlignment: Pointer + +#Перенос длинных комментов +ReflowComments: false + +#Удалять {} у if, for, ... где их можно опустить (single-line тело) +#false - не удаляем +RemoveBracesLLVM: false + +#Указывает использование пустых строк для разделения блоков определения, +#включая классы, структуры, перечисления и функции. +#Leave - гибкая настройка. Оставить как есть +SeparateDefinitionBlocks: Leave + +#Максимальное количество развернутых строк, которые охватывает короткое пространство имен. +ShortNamespaceLines: 5 + +#При сортировке инклюдов учитывать регистр +SortIncludes: CaseSensitive + +#Если true, clang-format будет сортировать using-декларации +SortUsingDeclarations: false + +#Пробел после CStyle cast (int) a; +SpaceAfterCStyleCast: false + +#пробел после '!' в логических условиях +SpaceAfterLogicalNot: false + +#Пробел после ключевого слова template +SpaceAfterTemplateKeyword: true + +#Пробелы после PointerQualifiers +# Default - также как в PointerAlignment +SpaceAroundPointerQualifiers: Default + +#Пробел перед '=' +SpaceBeforeAssignmentOperators: true + +#Пробел после case colon: (case 1 : ) +#false - (case 1:) +SpaceBeforeCaseColon: false + +#Если значение равно true, перед списком в фигурных скобках C++11, +#используемым для инициализации объекта, будет вставлен пробел +#(после предшествующего идентификатора или типа). +SpaceBeforeCpp11BracedList: true + +#Если false, пробелы будут удалены перед двоеточием инициализатора конструктора. +SpaceBeforeCtorInitializerColon: true + +#Если false, пробелы будут удалены перед двоеточием наследования. +SpaceBeforeInheritanceColon: true + +#Определяет, в каких случаях ставить пробел перед открывающими скобками. +# ControlStatements ставит пробел перед открывающими скобками только +# после ключевых слов (for/if/while...). +SpaceBeforeParens: ControlStatements + +#Если false, пробелы будут удалены перед двоеточием цикла range-based fr. +SpaceBeforeRangeBasedForLoopColon: true + +#Если true, вокруг условий if/for/switch/while будут вставлены пробелы. +SpacesInConditionalStatement: false + +--- diff --git a/WidgetMovement/mainwindow.cpp b/WidgetMovement/mainwindow.cpp index 33e8541..38334a4 100644 --- a/WidgetMovement/mainwindow.cpp +++ b/WidgetMovement/mainwindow.cpp @@ -1,25 +1,34 @@ -#include #include #include +#include #include "mainwindow.h" -MainWindow::MainWindow(QWidget *parent) - : QMainWindow(parent) +MainWindow::MainWindow(QWidget* parent) : + QMainWindow(parent) { resize(300, 600); m_timer = new QTimer(this); m_timer->start(1000); - connect(m_timer, &QTimer::timeout, m_timer, [this]() - { - constexpr int minTimeMs = 100, maxTimeMs = 1000; - this->m_timer->setInterval(QRandomGenerator::global()->bounded(minTimeMs, maxTimeMs)); - auto button = new QPushButton(this); - auto windowSize = this->size(); - auto buttonSize = QSize(10, 10); - auto position = QPoint(QRandomGenerator::global()->bounded(0, windowSize.width()-buttonSize.width()), 100); - button->setGeometry(QRect(position, buttonSize)); - button->show(); }); + connect(m_timer, &QTimer::timeout, this, [this]() { + constexpr auto buttonSize = QSize(10, 10); + constexpr auto minIntervalMs = 100, maxIntervalMs = 1000; + this->m_timer->setInterval(QRandomGenerator::global()->bounded(minIntervalMs, maxIntervalMs)); + auto button = new QPushButton(this); + auto windowSize = this->size(); + auto position = QPoint(QRandomGenerator::global()->bounded(0, windowSize.width() - buttonSize.width()), 100); + button->setGeometry(QRect(position, buttonSize)); + button->show(); + auto buttonTimer = new QTimer(button); + buttonTimer->setInterval(20); + connect(buttonTimer, &QTimer::timeout, button, [button](){ + constexpr auto movement = QPoint(0, 1); + button->move(button->pos()+movement); + if(!button->parentWidget()->contentsRect().contains(button->geometry())) { + button->deleteLater(); + } + }); + buttonTimer->start(); }); } MainWindow::~MainWindow() From c914ade89790a3334052b726273f3b1688e5cbc1 Mon Sep 17 00:00:00 2001 From: Andrey Zotov Date: Sun, 24 Mar 2024 14:29:07 +0500 Subject: [PATCH 04/12] Random speed --- WidgetMovement/mainwindow.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/WidgetMovement/mainwindow.cpp b/WidgetMovement/mainwindow.cpp index 38334a4..755f387 100644 --- a/WidgetMovement/mainwindow.cpp +++ b/WidgetMovement/mainwindow.cpp @@ -12,15 +12,17 @@ MainWindow::MainWindow(QWidget* parent) : m_timer->start(1000); connect(m_timer, &QTimer::timeout, this, [this]() { constexpr auto buttonSize = QSize(10, 10); - constexpr auto minIntervalMs = 100, maxIntervalMs = 1000; - this->m_timer->setInterval(QRandomGenerator::global()->bounded(minIntervalMs, maxIntervalMs)); + constexpr auto minCreateInvlMs = 100, maxInvlMs = 1000; + constexpr auto minMoveInvlMs = 15, maxMoveInvlMs = 30; + this->m_timer->setInterval(QRandomGenerator::global()->bounded(minCreateInvlMs, maxInvlMs)); auto button = new QPushButton(this); auto windowSize = this->size(); auto position = QPoint(QRandomGenerator::global()->bounded(0, windowSize.width() - buttonSize.width()), 100); button->setGeometry(QRect(position, buttonSize)); button->show(); auto buttonTimer = new QTimer(button); - buttonTimer->setInterval(20); + auto moveInterval = QRandomGenerator::global()->bounded(minMoveInvlMs, maxMoveInvlMs); + buttonTimer->setInterval(moveInterval); connect(buttonTimer, &QTimer::timeout, button, [button](){ constexpr auto movement = QPoint(0, 1); button->move(button->pos()+movement); From 0670f4a3c17031d912171a8da8292d453b6f654e Mon Sep 17 00:00:00 2001 From: Andrey Zotov Date: Sun, 24 Mar 2024 14:39:39 +0500 Subject: [PATCH 05/12] =?UTF-8?q?=D0=A3=D0=BD=D0=B8=D1=87=D1=82=D0=BE?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BE?= =?UTF-8?q?=D0=BA=20(=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=BC=D1=8B?= =?UTF-8?q?=D1=88=D1=8C=D1=8E)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WidgetMovement/mainwindow.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/WidgetMovement/mainwindow.cpp b/WidgetMovement/mainwindow.cpp index 755f387..ed05ee5 100644 --- a/WidgetMovement/mainwindow.cpp +++ b/WidgetMovement/mainwindow.cpp @@ -8,6 +8,7 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) { resize(300, 600); + grabKeyboard(); m_timer = new QTimer(this); m_timer->start(1000); connect(m_timer, &QTimer::timeout, this, [this]() { @@ -30,6 +31,8 @@ MainWindow::MainWindow(QWidget* parent) : button->deleteLater(); } }); + connect(button, &QPushButton::clicked, button, [button](){ + button->deleteLater();}); buttonTimer->start(); }); } From 823ae65db4c54b246c2ecee3e910b5801ad4e898 Mon Sep 17 00:00:00 2001 From: Andrey Zotov Date: Sun, 24 Mar 2024 14:46:02 +0500 Subject: [PATCH 06/12] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=B3=D0=BE=D0=BB=D0=BE=D0=B2?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BE=D0=BA=D0=BD=D0=B0=20=D0=BF=D1=80=D0=B8=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B8=D0=B3=D1=80=D1=8B=D1=88=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WidgetMovement/mainwindow.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/WidgetMovement/mainwindow.cpp b/WidgetMovement/mainwindow.cpp index ed05ee5..9112eac 100644 --- a/WidgetMovement/mainwindow.cpp +++ b/WidgetMovement/mainwindow.cpp @@ -30,6 +30,10 @@ MainWindow::MainWindow(QWidget* parent) : if(!button->parentWidget()->contentsRect().contains(button->geometry())) { button->deleteLater(); } + if(button->geometry().bottom() >= button->parentWidget()->contentsRect().bottom()) + { + button->parentWidget()->setWindowTitle("You loose!"); + } }); connect(button, &QPushButton::clicked, button, [button](){ button->deleteLater();}); From b4783086998df103463f9c7f64b55b6ad07b7541 Mon Sep 17 00:00:00 2001 From: Andrey Zotov Date: Sun, 24 Mar 2024 14:49:28 +0500 Subject: [PATCH 07/12] =?UTF-8?q?=D0=A3=D1=81=D0=BA=D0=BE=D1=80=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=B2=D0=B8=D0=B6=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=BE=D0=B4=20=D0=BC=D1=8B=D1=88=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WidgetMovement/mainwindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WidgetMovement/mainwindow.cpp b/WidgetMovement/mainwindow.cpp index 9112eac..16d2760 100644 --- a/WidgetMovement/mainwindow.cpp +++ b/WidgetMovement/mainwindow.cpp @@ -12,7 +12,7 @@ MainWindow::MainWindow(QWidget* parent) : m_timer = new QTimer(this); m_timer->start(1000); connect(m_timer, &QTimer::timeout, this, [this]() { - constexpr auto buttonSize = QSize(10, 10); + constexpr auto buttonSize = QSize(15, 15); constexpr auto minCreateInvlMs = 100, maxInvlMs = 1000; constexpr auto minMoveInvlMs = 15, maxMoveInvlMs = 30; this->m_timer->setInterval(QRandomGenerator::global()->bounded(minCreateInvlMs, maxInvlMs)); @@ -25,7 +25,7 @@ MainWindow::MainWindow(QWidget* parent) : auto moveInterval = QRandomGenerator::global()->bounded(minMoveInvlMs, maxMoveInvlMs); buttonTimer->setInterval(moveInterval); connect(buttonTimer, &QTimer::timeout, button, [button](){ - constexpr auto movement = QPoint(0, 1); + auto movement = button->underMouse()?QPoint(0, 2):QPoint(0, 1); button->move(button->pos()+movement); if(!button->parentWidget()->contentsRect().contains(button->geometry())) { button->deleteLater(); From a8e8473822444c37bf286036fb72a24aa45d7f73 Mon Sep 17 00:00:00 2001 From: Andrey Zotov Date: Sun, 24 Mar 2024 14:59:35 +0500 Subject: [PATCH 08/12] =?UTF-8?q?=D0=A3=D1=81=D1=82=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B1=D0=B0=D0=B3=D0=B0=20=D1=81=20?= =?UTF-8?q?=D1=83=D1=81=D0=BA=D0=BE=D1=80=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=20Drag&Drop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WidgetMovement/mainwindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/WidgetMovement/mainwindow.cpp b/WidgetMovement/mainwindow.cpp index 16d2760..0cef28c 100644 --- a/WidgetMovement/mainwindow.cpp +++ b/WidgetMovement/mainwindow.cpp @@ -21,6 +21,7 @@ MainWindow::MainWindow(QWidget* parent) : auto position = QPoint(QRandomGenerator::global()->bounded(0, windowSize.width() - buttonSize.width()), 100); button->setGeometry(QRect(position, buttonSize)); button->show(); + button->setMouseTracking(true); auto buttonTimer = new QTimer(button); auto moveInterval = QRandomGenerator::global()->bounded(minMoveInvlMs, maxMoveInvlMs); buttonTimer->setInterval(moveInterval); From b7a53b58efd06314621c6c56b54bf89a17161bb4 Mon Sep 17 00:00:00 2001 From: Andrey Zotov Date: Sun, 24 Mar 2024 15:09:30 +0500 Subject: [PATCH 09/12] Red background when you loose --- WidgetMovement/mainwindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/WidgetMovement/mainwindow.cpp b/WidgetMovement/mainwindow.cpp index 0cef28c..a413a3c 100644 --- a/WidgetMovement/mainwindow.cpp +++ b/WidgetMovement/mainwindow.cpp @@ -34,6 +34,7 @@ MainWindow::MainWindow(QWidget* parent) : if(button->geometry().bottom() >= button->parentWidget()->contentsRect().bottom()) { button->parentWidget()->setWindowTitle("You loose!"); + button->parentWidget()->setStyleSheet("QMainWindow { background: red }"); } }); connect(button, &QPushButton::clicked, button, [button](){ From 31b96bf7f2d22cbfca949684d2e9de79457109f3 Mon Sep 17 00:00:00 2001 From: Andrey Zotov Date: Sun, 24 Mar 2024 15:27:28 +0500 Subject: [PATCH 10/12] Text on buttons --- WidgetMovement/mainwindow.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WidgetMovement/mainwindow.cpp b/WidgetMovement/mainwindow.cpp index a413a3c..14718ba 100644 --- a/WidgetMovement/mainwindow.cpp +++ b/WidgetMovement/mainwindow.cpp @@ -20,8 +20,8 @@ MainWindow::MainWindow(QWidget* parent) : auto windowSize = this->size(); auto position = QPoint(QRandomGenerator::global()->bounded(0, windowSize.width() - buttonSize.width()), 100); button->setGeometry(QRect(position, buttonSize)); + button->setText("*"); button->show(); - button->setMouseTracking(true); auto buttonTimer = new QTimer(button); auto moveInterval = QRandomGenerator::global()->bounded(minMoveInvlMs, maxMoveInvlMs); buttonTimer->setInterval(moveInterval); @@ -33,11 +33,11 @@ MainWindow::MainWindow(QWidget* parent) : } if(button->geometry().bottom() >= button->parentWidget()->contentsRect().bottom()) { - button->parentWidget()->setWindowTitle("You loose!"); + button->parentWidget()->setWindowTitle("Вы проиграли!"); button->parentWidget()->setStyleSheet("QMainWindow { background: red }"); } }); - connect(button, &QPushButton::clicked, button, [button](){ + connect(button, &QPushButton::pressed, button, [button](){ button->deleteLater();}); buttonTimer->start(); }); } From 0952f1d45bd4535aaaffcfe151c7c42d599dfed4 Mon Sep 17 00:00:00 2001 From: Andrey Zotov Date: Sun, 24 Mar 2024 15:30:00 +0500 Subject: [PATCH 11/12] Refactor --- WidgetMovement/mainwindow.cpp | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/WidgetMovement/mainwindow.cpp b/WidgetMovement/mainwindow.cpp index 14718ba..d10fc0c 100644 --- a/WidgetMovement/mainwindow.cpp +++ b/WidgetMovement/mainwindow.cpp @@ -9,37 +9,42 @@ MainWindow::MainWindow(QWidget* parent) : { resize(300, 600); grabKeyboard(); + m_timer = new QTimer(this); - m_timer->start(1000); connect(m_timer, &QTimer::timeout, this, [this]() { - constexpr auto buttonSize = QSize(15, 15); - constexpr auto minCreateInvlMs = 100, maxInvlMs = 1000; - constexpr auto minMoveInvlMs = 15, maxMoveInvlMs = 30; - this->m_timer->setInterval(QRandomGenerator::global()->bounded(minCreateInvlMs, maxInvlMs)); + this->m_timer->setInterval(QRandomGenerator::global()->bounded(100, 1000)); + auto button = new QPushButton(this); - auto windowSize = this->size(); - auto position = QPoint(QRandomGenerator::global()->bounded(0, windowSize.width() - buttonSize.width()), 100); - button->setGeometry(QRect(position, buttonSize)); + constexpr auto buttonSize = QSize(15, 15); + auto buttonPos = QPoint( + QRandomGenerator::global()->bounded(0, this->size().width() - buttonSize.width()), + 100 + ); + button->setGeometry(QRect(buttonPos, buttonSize)); button->setText("*"); button->show(); + auto buttonTimer = new QTimer(button); - auto moveInterval = QRandomGenerator::global()->bounded(minMoveInvlMs, maxMoveInvlMs); - buttonTimer->setInterval(moveInterval); connect(buttonTimer, &QTimer::timeout, button, [button](){ auto movement = button->underMouse()?QPoint(0, 2):QPoint(0, 1); button->move(button->pos()+movement); + if(!button->parentWidget()->contentsRect().contains(button->geometry())) { button->deleteLater(); } + if(button->geometry().bottom() >= button->parentWidget()->contentsRect().bottom()) { button->parentWidget()->setWindowTitle("Вы проиграли!"); button->parentWidget()->setStyleSheet("QMainWindow { background: red }"); } }); + connect(button, &QPushButton::pressed, button, [button](){ button->deleteLater();}); - buttonTimer->start(); }); + + buttonTimer->start(QRandomGenerator::global()->bounded(15, 30)); }); + m_timer->start(1000); } MainWindow::~MainWindow() From 7af7a4208599b9f1bf2f0c1ab788e6e42f2bc6cc Mon Sep 17 00:00:00 2001 From: Andrey Zotov Date: Mon, 25 Mar 2024 20:21:55 +0500 Subject: [PATCH 12/12] =?UTF-8?q?=D0=A3=D1=81=D1=82=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=87=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WidgetMovement/mainwindow.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/WidgetMovement/mainwindow.cpp b/WidgetMovement/mainwindow.cpp index d10fc0c..a2df6d9 100644 --- a/WidgetMovement/mainwindow.cpp +++ b/WidgetMovement/mainwindow.cpp @@ -11,14 +11,15 @@ MainWindow::MainWindow(QWidget* parent) : grabKeyboard(); m_timer = new QTimer(this); - connect(m_timer, &QTimer::timeout, this, [this]() { - this->m_timer->setInterval(QRandomGenerator::global()->bounded(100, 1000)); + constexpr auto minCreationTimeMs = 100, maxCreationTimeMs = 1000; + connect(m_timer, &QTimer::timeout, this, [this, minCreationTimeMs, maxCreationTimeMs]() { + m_timer->setInterval(QRandomGenerator::global()->bounded(minCreationTimeMs, maxCreationTimeMs)); auto button = new QPushButton(this); constexpr auto buttonSize = QSize(15, 15); - auto buttonPos = QPoint( - QRandomGenerator::global()->bounded(0, this->size().width() - buttonSize.width()), - 100 + const auto buttonPos = QPoint( + QRandomGenerator::global()->bounded(0, size().width() - buttonSize.width()), + QRandomGenerator::global()->bounded(0, 100 - buttonSize.height()) ); button->setGeometry(QRect(buttonPos, buttonSize)); button->setText("*"); @@ -44,7 +45,7 @@ MainWindow::MainWindow(QWidget* parent) : button->deleteLater();}); buttonTimer->start(QRandomGenerator::global()->bounded(15, 30)); }); - m_timer->start(1000); + m_timer->start(QRandomGenerator::global()->bounded(minCreationTimeMs, maxCreationTimeMs)); } MainWindow::~MainWindow()