- init: inti repo

This commit is contained in:
2026-04-05 16:14:54 +03:00
commit 590975b1f0
28 changed files with 1948 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
cmake-build-debug

10
.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,10 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Ignored default folder with query files
/queries/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

1
.idea/.name generated Normal file
View File

@@ -0,0 +1 @@
StationManager

18
.idea/QtSettings.xml generated Normal file
View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="QtSettings">
<option name="myCurrentProfile" value="Debug" />
<option name="mySettingsPerProfile">
<map>
<entry key="Debug">
<value>
<PerProfileState>
<option name="myQmlPath" value="$PROJECT_DIR$/../../../../Qt/6.11.0/mingw_64/qml" />
<option name="myQtBinPath" value="$PROJECT_DIR$/../../../../Qt/6.11.0/mingw_64/bin" />
</PerProfileState>
</value>
</entry>
</map>
</option>
</component>
</project>

12
.idea/dataSources.xml generated Normal file
View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="station" uuid="4e7503e4-2f44-472c-9598-3464bb9d87a0">
<driver-ref>sqlite.xerial</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.sqlite.JDBC</jdbc-driver>
<jdbc-url>jdbc:sqlite:$PROJECT_DIR$/cmake-build-debug/station.db</jdbc-url>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</component>
</project>

345
.idea/editor.xml generated Normal file
View File

@@ -0,0 +1,345 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="BackendCodeEditorSettings">
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CDeclarationWithImplicitIntType/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CommentTypo/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConstevalIfIsAlwaysConstant/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractClassWithoutSpecifier/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractFinalClass/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractVirtualFunctionCallInCtor/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAccessSpecifierWithNoDeclarations/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAwaiterTypeIsNotClass/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBooleanIncrementExpression/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatBadCode/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatLegacyCode/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatMixedArgs/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatTooFewArgs/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatTooManyArgs/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCStyleCast/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCVQualifierCanNotBeAppliedToReference/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassCanBeFinal/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassIsIncomplete/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassNeedsConstructorBecauseOfUninitializedMember/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCompileTimeConstantCanBeReplacedWithBooleanConstant/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConceptNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConditionalExpressionCanBeSimplified/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConstParameterInDeclaration/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConstValueFunctionReturnType/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCoroutineCallResolveError/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAArrayIndexOutOfBounds/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantConditions/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantFunctionResult/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantParameter/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFADeletedPointer/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAEndlessLoop/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAInfiniteRecursion/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAInvalidatedMemory/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALocalValueEscapesFunction/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALocalValueEscapesScope/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALoopConditionNotUpdated/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAMemoryLeak/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFANotInitializedField/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFANullDereference/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFATimeOver/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreachableCode/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreachableFunctionCall/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreadVariable/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnusedValue/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationHidesLocal/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationHidesUncapturedLocal/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationSpecifierWithoutDeclarators/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorDisambiguatedAsFunction/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorUsedBeforeInitialization/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultCaseNotHandledInSwitchStatement/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultInitializationWithNoUserConstructor/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultIsUsedAsIdentifier/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultedSpecialMemberFunctionIsImplicitlyDeleted/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefinitionsOrder/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeletingVoidPointer/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDependentTemplateWithoutTemplateKeyword/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDependentTypeWithoutTypenameKeyword/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedEntity/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedOverridenMethod/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedRegisterStorageClassSpecifier/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDereferenceOperatorLimitExceeded/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDiscardedPostfixOperatorResult/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenSyntaxError/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenUndocumentedParameter/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenUnresolvedReference/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEmptyDeclaration/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceCVQualifiersOrder/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceCVQualifiersPlacement/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceDoStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceForStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceFunctionDeclarationStyle/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceIfStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceNestedNamespacesStyle/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceOverridingDestructorStyle/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceOverridingFunctionStyle/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceTypeAliasCodeStyle/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceWhileStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEntityAssignedButNoRead/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEntityUsedOnlyInUnevaluatedContext/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnumeratorNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEqualOperandsInBinaryExpression/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEvaluationFailure/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppExplicitSpecializationInNonNamespaceScope/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppExpressionWithoutSideEffects/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFinalFunctionInFinalClass/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFinalNonOverridingVirtualFunction/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppForLoopCanBeReplacedWithWhile/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppForwardEnumDeclarationWithoutUnderlyingType/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionDoesntReturnValue/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionIsNotImplemented/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionResultShouldBeUsed/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionalStyleCast/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHeaderHasBeenAlreadyIncluded/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHiddenFunction/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHidingFunction/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIdenticalOperandsInBinaryExpression/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIfCanBeReplacedByConstexprIf/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppImplicitDefaultConstructorNotAvailable/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIncompatiblePointerConversion/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIncompleteSwitchStatement/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppInconsistentNaming/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIntegralToPointerConversion/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppInvalidLineContinuation/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppJoinDeclarationAndAssignment/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLambdaCaptureNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableMayBeConst/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableMightNotBeInitialized/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableWithNonTrivialDtorIsNeverUsed/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLongFloat/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberFunctionMayBeConst/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberFunctionMayBeStatic/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberInitializersOrder/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMismatchedClassTags/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMissingIncludeGuard/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMissingKeywordThrow/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppModulePartitionWithSeveralPartitionUnits/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtAddressOfClassRValue/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtBindingRValueToLvalueReference/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtCopyElisionInCopyInitDeclarator/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtDoubleUserConversionInCopyInit/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtNotInitializedStaticConstLocalVar/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtReinterpretCastFromNullptr/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMultiCharacterLiteral/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMultiCharacterWideLiteral/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMustBePublicVirtualToImplementInterface/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMutableSpecifierOnReferenceMember/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNoDiscardExpression/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNodiscardFunctionWithoutReturnValue/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExceptionSafeResourceAcquisition/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExplicitConversionOperator/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExplicitConvertingConstructor/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonInlineFunctionDefinitionInHeaderFile/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonInlineVariableDefinitionInHeaderFile/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNotAllPathsReturnValue/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppObjectMemberMightNotBeInitialized/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppOutParameterMustBeWritten/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterMayBeConst/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterMayBeConstPtrOrRef/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterNamesMismatch/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterNeverUsed/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPassValueParameterByConstReference/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPointerConversionDropsQualifiers/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPointerToIntegralConversion/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPolymorphicClassWithNonVirtualPublicDestructor/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyErroneousEmptyStatements/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyUninitializedMember/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyUnintendedObjectSlicing/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrecompiledHeaderIsNotIncluded/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrecompiledHeaderNotFound/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfBadFormat/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfExtraArg/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfMissedArg/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfRiskyFormat/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrivateSpecialMemberFunctionIsNotImplemented/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRangeBasedForIncompatibleReference/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedefinitionOfDefaultArgumentInOverrideFunction/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantAccessSpecifier/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBaseClassAccessSpecifier/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBaseClassInitializer/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBooleanExpressionArgument/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantCastExpression/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantComplexityInComparison/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantConditionalExpression/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantConstSpecifier/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantControlFlowJump/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantDereferencingAndTakingAddress/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElaboratedTypeSpecifier/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElseKeyword/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElseKeywordInsideCompoundStatement/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantEmptyDeclaration/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantEmptyStatement/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantExportKeyword/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantFwdClassOrEnumSpecifier/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantInlineSpecifier/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantLambdaParameterList/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantMemberInitializer/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantNamespaceDefinition/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantParentheses/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantQualifier/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantQualifierADL/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantStaticSpecifierOnMemberAllocationFunction/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantStaticSpecifierOnThreadLocalLocalVariable/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTemplateArguments/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTemplateKeyword/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTypenameKeyword/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantVoidArgumentList/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantZeroInitializerInAggregateInitialization/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReinterpretCastFromVoidPtr/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRemoveRedundantBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReplaceMemsetWithZeroInitialization/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReplaceTieWithStructuredBinding/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReturnNoValueInNonVoidFunction/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSmartPointerVsMakeFunction/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSomeObjectMembersMightNotBeInitialized/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSpecialFunctionWithoutNoexceptSpecification/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticAssertFailure/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticDataMemberInUnnamedStruct/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticSpecifierOnAnonymousNamespaceMember/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStringLiteralToCharPointerConversion/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTabsAreDisallowed/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateArgumentsCanBeDeduced/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateParameterNeverUsed/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateParameterShadowing/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppThrowExpressionCanBeReplacedWithRethrow/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTooWideScope/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTooWideScopeInitStatement/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTypeAliasNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUninitializedDependentBaseClass/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUninitializedNonStaticDataMember/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnionMemberOfReferenceType/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnmatchedPragmaEndRegionDirective/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnmatchedPragmaRegionDirective/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnnamedNamespaceInHeaderFile/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnnecessaryWhitespace/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnsignedZeroComparison/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnusedIncludeDirective/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAlgorithmWithCount/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAssociativeContains/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAuto/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAutoForNumeric/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseElementsView/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseEraseAlgorithm/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseFamiliarTemplateSyntaxForGenericLambdas/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseRangeAlgorithm/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseStdSize/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseStructuredBinding/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseTypeTraitAlias/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUserDefinedLiteralSuffixDoesNotStartWithUnderscore/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUsingResultOfAssignmentAsCondition/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVariableCanBeMadeConstexpr/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVirtualFunctionCallInsideCtor/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVirtualFunctionInFinalClass/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVolatileParameterInDeclaration/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWarningDirective/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWrongIncludesOrder/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWrongSlashesInIncludeDirective/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppZeroConstantCanBeReplacedWithNullptr/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppZeroValuedExpressionUsedAsNullPointer/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=IdentifierTypo/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=IfStdIsConstantEvaluatedCanBeReplaced/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=StdIsConstantEvaluatedWillAlwaysEvaluateToConstant/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=StringLiteralTypo/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppClangFormat/EnableClangFormatSupport/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_ARGUMENT/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_BINARY_EXPRESSIONS_CHAIN/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_CALLS_CHAIN/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_EXPRESSION/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_EXTENDS_LIST/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_FOR_STMT/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_PARAMETER/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_TYPE_ARGUMENT/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_TYPE_PARAMETER/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTIPLE_DECLARATION/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_TERNARY/@EntryValue" value="ALIGN_ALL" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ANONYMOUS_METHOD_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_CLASS_DEFINITION/@EntryValue" value="1" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_DECLARATIONS/@EntryValue" value="0" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_FUNCTION_DECLARATION/@EntryValue" value="1" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_FUNCTION_DEFINITION/@EntryValue" value="1" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BREAK_TEMPLATE_DECLARATION/@EntryValue" value="LINE_BREAK" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/CASE_BLOCK_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/CONTINUOUS_LINE_INDENT/@EntryValue" value="Double" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_ACCESS_SPECIFIERS_FROM_CLASS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_CASE_FROM_SWITCH/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_CLASS_MEMBERS_FROM_ACCESS_SPECIFIERS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_COMMENT/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_SIZE/@EntryValue" value="4" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_STYLE/@EntryValue" value="Space" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INITIALIZER_BRACES/@EntryValue" value="END_OF_LINE_NO_SPACE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INT_ALIGN_EQ/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INVOCABLE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_BLANK_LINES_IN_CODE/@EntryValue" value="2" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_BLANK_LINES_IN_DECLARATIONS/@EntryValue" value="2" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_USER_LINEBREAKS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/LINE_BREAK_AFTER_COLON_IN_MEMBER_INITIALIZER_LISTS/@EntryValue" value="ON_SINGLE_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/MEMBER_INITIALIZER_LIST_STYLE/@EntryValue" value="DO_NOT_CHANGE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/NAMESPACE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/NAMESPACE_INDENTATION/@EntryValue" value="All" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/OTHER_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_CATCH_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_ELSE_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_NAMESPACE_DEFINITIONS_ON_SAME_LINE/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_WHILE_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SIMPLE_BLOCK_STYLE/@EntryValue" value="DO_NOT_CHANGE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_CAST_EXPRESSION_PARENTHESES/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COLON_IN_BITFIELD_DECLARATOR/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COMMA_IN_TEMPLATE_ARGS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COMMA_IN_TEMPLATE_PARAMS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_EXTENDS_COLON/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_FOR_COLON/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_FOR_SEMICOLON/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_DATA_MEMBER/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_DATA_MEMBERS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_METHOD/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_NESTED_DECLARATOR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_DATA_MEMBER/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_DATA_MEMBERS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_METHOD/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_UNARY_OPERATOR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_COLON_IN_BITFIELD_DECLARATOR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_EXTENDS_COLON/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_FOR_COLON/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_FOR_SEMICOLON/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_ABSTRACT_DECL/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_DATA_MEMBER/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_DATA_MEMBERS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_METHOD/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_ABSTRACT_DECL/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_DATA_MEMBER/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_DATA_MEMBERS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_METHOD/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_TEMPLATE_ARGS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BETWEEN_CLOSING_ANGLE_BRACKETS_IN_TEMPLATE_ARGS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_ARRAY_ACCESS_BRACKETS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_CAST_EXPRESSION_PARENTHESES/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_DECLARATION_PARENTHESES/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_BLOCKS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_INITIALIZER_BRACES/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_METHOD_PARENTHESES/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_INITIALIZER_BRACES/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_TEMPLATE_ARGS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPECIAL_ELSE_IF_TREATMENT/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/TAB_WIDTH/@EntryValue" value="4" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/TYPE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_BINARY_OPSIGN/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_DECLARATION_LPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_INVOCATION_LPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_ARGUMENTS_STYLE/@EntryValue" value="WRAP_IF_LONG" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_DECLARATION_LPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_DECLARATION_RPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_INVOCATION_LPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_INVOCATION_RPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_TERNARY_OPSIGNS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_PARAMETERS_STYLE/@EntryValue" value="WRAP_IF_LONG" type="string" />
<option name="/Default/CodeStyle/EditorConfig/EnableClangFormatSupport/@EntryValue" value="false" type="bool" />
</component>
</project>

4
.idea/encodings.xml generated Normal file
View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" />
</project>

7
.idea/misc.xml generated Normal file
View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CMakePythonSetting">
<option name="pythonIntegrationState" value="YES" />
</component>
<component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" />
</project>

8
.idea/modules.xml generated Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/untitled.iml" filepath="$PROJECT_DIR$/.idea/untitled.iml" />
</modules>
</component>
</project>

2
.idea/untitled.iml generated Normal file
View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<module classpath="CIDR" type="CPP_MODULE" version="4" />

6
.idea/vcs.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

85
CMakeLists.txt Normal file
View File

@@ -0,0 +1,85 @@
cmake_minimum_required(VERSION 4.2)
project(StationManager)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_PREFIX_PATH "C:/Qt/6.11.0/mingw_64")
find_package(Qt6 COMPONENTS
Core
Gui
Widgets
Sql
REQUIRED)
set(SOURCES
main.cpp
database.cpp
loginwindow.cpp
mainwindow.cpp
routeswidget.cpp
ticketswidget.cpp
printwidget.cpp
userswidget.cpp
)
set(HEADERS
database.h
loginwindow.h
mainwindow.h
routeswidget.h
ticketswidget.h
printwidget.h
userswidget.h
database.cpp
)
add_executable(StationManager ${SOURCES} ${HEADERS})
target_link_libraries(StationManager
Qt::Core
Qt::Gui
Qt::Widgets
Qt::Sql
)
if (WIN32 AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
set(DEBUG_SUFFIX)
if (MSVC AND CMAKE_BUILD_TYPE MATCHES "Debug")
set(DEBUG_SUFFIX "d")
endif ()
set(QT_INSTALL_PATH "${CMAKE_PREFIX_PATH}")
message(STATUS "CMAKE PATH ${CMAKE_PREFIX_PATH}")
if (NOT EXISTS "${QT_INSTALL_PATH}/bin")
set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")
if (NOT EXISTS "${QT_INSTALL_PATH}/bin")
set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..")
endif ()
endif ()
if (EXISTS "${QT_INSTALL_PATH}/plugins/sqldrivers/qsqlite.dll")
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory
"$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/sqldrivers/")
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
"${QT_INSTALL_PATH}/plugins/sqldrivers/qsqlite.dll"
"$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/sqldrivers/")
endif ()
if (EXISTS "${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll")
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory
"$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/")
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
"${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll"
"$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/")
endif ()
foreach (QT_LIB Core Gui Widgets Sql)
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
"${QT_INSTALL_PATH}/bin/Qt6${QT_LIB}${DEBUG_SUFFIX}.dll"
"$<TARGET_FILE_DIR:${PROJECT_NAME}>")
endforeach (QT_LIB)
endif ()

78
SPEC.md Normal file
View File

@@ -0,0 +1,78 @@
# Система учета работы вокзала - Спецификация
## 1. Обзор
**Название:** StationManager
**Тип:** Десктопное приложение (Qt6 + SQLite)
**Назначение:** Учет продажи билетов на железнодорожном вокзале
## 2. Функциональность
### 2.1 Авторизация
- Форма входа с логином и паролем
- Хранение пользователей в БД
- Роли: Администратор, Кассир
- Админ может добавлять пользователей
### 2.2 Продажа билетов
- Выбор рейса из списка
- Ввод данных пассажира (ФИО, номер документа)
- Выбор количества билетов
- Автоматический расчет стоимости
- Сохранение в базу данных
### 2.3 Управление рейсами
- Добавление новых рейсов (маршрут, дата/время, цена, количество мест)
- Просмотр списка рейсов
- Редактирование/удаление рейсов
### 2.4 Печать билетов
- Фильтрация по номеру рейса
- Отображение списка проданных билетов
- Экспорт в текстовый файл для печати
## 3. Архитектура БД
### Таблица users
| Поле | Тип | Описание |
|------|-----|----------|
| id | INTEGER PK | ID пользователя |
| username | TEXT | Логин |
| password | TEXT | Пароль (хеш) |
| role | TEXT | Роль (admin/cashier) |
### Таблица routes
| Поле | Тип | Описание |
|------|-----|----------|
| id | INTEGER PK | ID рейса |
| route_name | TEXT | Название маршрута |
| departure_time | TEXT | Дата/время отправления |
| price | REAL | Цена билета |
| total_seats | INTEGER | Всего мест |
| available_seats | INTEGER | Свободных мест |
### Таблица tickets
| Поле | Тип | Описание |
|------|-----|----------|
| id | INTEGER PK | ID билета |
| route_id | INTEGER FK | ID рейса |
| passenger_name | TEXT | ФИО пассажира |
| document_number | TEXT | Номер документа |
| seat_count | INTEGER | Количество билетов |
| total_price | REAL | Общая стоимость |
| seller_id | INTEGER FK | ID кассира |
| sale_date | TEXT | Дата продажи |
## 4. Интерфейс
### Окна:
1. **LoginWindow** - авторизация
2. **MainWindow** - главное окно с меню
3. **RoutesWidget** - управление рейсами
4. **TicketsWidget** - продажа билетов
5. **PrintWidget** - печать списка билетов
6. **UsersWidget** - управление пользователями (admin)
### Навигация:
- Боковое меню с переключением между виджетами
- Строка состояния с информацией о текущем пользователе

306
database.cpp Normal file
View File

@@ -0,0 +1,306 @@
#include "database.h"
#include <QSqlQuery>
#include <QSqlError>
#include <QSqlRecord>
#include <QFile>
#include <QTextStream>
#include <QDir>
Database& Database::instance() {
static Database instance;
return instance;
}
bool Database::initialize() {
m_db = QSqlDatabase::addDatabase("QSQLITE", "StationDB");
QString dbPath = QDir::currentPath() + "/station.db";
m_db.setDatabaseName(dbPath);
if (!m_db.open()) {
qDebug() << QDir::currentPath() + "/station.db";
qDebug() << "Database open error:" << m_db.lastError().text();
return false;
}
QSqlQuery query(m_db);
query.exec("CREATE TABLE IF NOT EXISTS users ("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"username TEXT UNIQUE NOT NULL, "
"password TEXT NOT NULL, "
"role TEXT NOT NULL)");
query.exec("CREATE TABLE IF NOT EXISTS routes ("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"route_name TEXT NOT NULL, "
"departure_time TEXT NOT NULL, "
"price REAL NOT NULL, "
"total_seats INTEGER NOT NULL, "
"available_seats INTEGER NOT NULL)");
query.exec("CREATE TABLE IF NOT EXISTS tickets ("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"route_id INTEGER NOT NULL, "
"passenger_name TEXT NOT NULL, "
"document_number TEXT NOT NULL, "
"seat_count INTEGER NOT NULL, "
"total_price REAL NOT NULL, "
"seller_id INTEGER NOT NULL, "
"sale_date TEXT NOT NULL, "
"FOREIGN KEY (route_id) REFERENCES routes(id), "
"FOREIGN KEY (seller_id) REFERENCES users(id))");
query.exec("SELECT COUNT(*) FROM users WHERE role = 'admin'");
if (query.next() && query.value(0).toInt() == 0) {
addUser("admin", "admin123", "admin");
}
return true;
}
QString Database::hashPassword(const QString& password) {
QByteArray hash = QCryptographicHash::hash(
password.toUtf8(), QCryptographicHash::Sha256);
return hash.toHex();
}
bool Database::authenticate(const QString& username, const QString& password) {
QSqlQuery query(m_db);
query.prepare("SELECT password FROM users WHERE username = ?");
query.addBindValue(username);
if (query.exec() && query.next()) {
return query.value(0).toString() == hashPassword(password);
}
return false;
}
User Database::getUser(const QString& username) {
User user;
QSqlQuery query(m_db);
query.prepare("SELECT id, username, password, role FROM users WHERE username = ?");
query.addBindValue(username);
if (query.exec() && query.next()) {
user.id = query.value(0).toInt();
user.username = query.value(1).toString();
user.password = query.value(2).toString();
user.role = query.value(3).toString();
}
return user;
}
QVector<User> Database::getAllUsers() {
QVector<User> users;
QSqlQuery query("SELECT id, username, password, role FROM users", m_db);
while (query.next()) {
User user;
user.id = query.value(0).toInt();
user.username = query.value(1).toString();
user.password = query.value(2).toString();
user.role = query.value(3).toString();
users.append(user);
}
return users;
}
bool Database::addUser(const QString& username, const QString& password, const QString& role) {
QSqlQuery query(m_db);
query.prepare("INSERT INTO users (username, password, role) VALUES (?, ?, ?)");
query.addBindValue(username);
query.addBindValue(hashPassword(password));
query.addBindValue(role);
return query.exec();
}
bool Database::deleteUser(int id) {
QSqlQuery query(m_db);
query.prepare("DELETE FROM users WHERE id = ? AND role != 'admin'");
query.addBindValue(id);
return query.exec();
}
QVector<Route> Database::getAllRoutes() {
QVector<Route> routes;
QSqlQuery query("SELECT id, route_name, departure_time, price, total_seats, available_seats FROM routes", m_db);
while (query.next()) {
Route route;
route.id = query.value(0).toInt();
route.routeName = query.value(1).toString();
route.departureTime = query.value(2).toString();
route.price = query.value(3).toDouble();
route.totalSeats = query.value(4).toInt();
route.availableSeats = query.value(5).toInt();
routes.append(route);
}
return routes;
}
Route Database::getRoute(int id) {
Route route;
QSqlQuery query(m_db);
query.prepare("SELECT id, route_name, departure_time, price, total_seats, available_seats FROM routes WHERE id = ?");
query.addBindValue(id);
if (query.exec() && query.next()) {
route.id = query.value(0).toInt();
route.routeName = query.value(1).toString();
route.departureTime = query.value(2).toString();
route.price = query.value(3).toDouble();
route.totalSeats = query.value(4).toInt();
route.availableSeats = query.value(5).toInt();
}
return route;
}
bool Database::addRoute(const QString& routeName, const QString& departureTime,
double price, int totalSeats) {
QSqlQuery query(m_db);
query.prepare("INSERT INTO routes (route_name, departure_time, price, total_seats, available_seats) "
"VALUES (?, ?, ?, ?, ?)");
query.addBindValue(routeName);
query.addBindValue(departureTime);
query.addBindValue(price);
query.addBindValue(totalSeats);
query.addBindValue(totalSeats);
return query.exec();
}
bool Database::updateRoute(const Route& route) {
QSqlQuery query(m_db);
query.prepare("UPDATE routes SET route_name = ?, departure_time = ?, price = ?, "
"total_seats = ?, available_seats = ? WHERE id = ?");
query.addBindValue(route.routeName);
query.addBindValue(route.departureTime);
query.addBindValue(route.price);
query.addBindValue(route.totalSeats);
query.addBindValue(route.availableSeats);
query.addBindValue(route.id);
return query.exec();
}
bool Database::deleteRoute(int id) {
QSqlQuery query(m_db);
query.prepare("DELETE FROM routes WHERE id = ?");
query.addBindValue(id);
return query.exec();
}
bool Database::updateAvailableSeats(int routeId, int change) {
QSqlQuery query(m_db);
query.prepare("UPDATE routes SET available_seats = available_seats + ? WHERE id = ?");
query.addBindValue(change);
query.addBindValue(routeId);
return query.exec();
}
QVector<Ticket> Database::getTicketsByRoute(int routeId) {
QVector<Ticket> tickets;
QSqlQuery query(m_db);
query.prepare("SELECT t.id, t.route_id, r.route_name, t.passenger_name, "
"t.document_number, t.seat_count, t.total_price, t.seller_id, "
"u.username, t.sale_date "
"FROM tickets t "
"JOIN routes r ON t.route_id = r.id "
"JOIN users u ON t.seller_id = u.id "
"WHERE t.route_id = :route_id");
query.bindValue(":route_id", routeId);
query.exec();
while (query.next()) {
Ticket ticket;
ticket.id = query.value(0).toInt();
ticket.routeId = query.value(1).toInt();
ticket.routeName = query.value(2).toString();
ticket.passengerName = query.value(3).toString();
ticket.documentNumber = query.value(4).toString();
ticket.seatCount = query.value(5).toInt();
ticket.totalPrice = query.value(6).toDouble();
ticket.sellerId = query.value(7).toInt();
ticket.sellerName = query.value(8).toString();
ticket.saleDate = query.value(9).toString();
tickets.append(ticket);
}
return tickets;
}
QVector<Ticket> Database::getAllTickets() {
QVector<Ticket> tickets;
QSqlQuery query("SELECT t.id, t.route_id, r.route_name, t.passenger_name, "
"t.document_number, t.seat_count, t.total_price, t.seller_id, "
"u.username, t.sale_date "
"FROM tickets t "
"JOIN routes r ON t.route_id = r.id "
"JOIN users u ON t.seller_id = u.id "
"ORDER BY t.sale_date DESC",m_db);
query.exec();
while (query.next()) {
Ticket ticket;
ticket.id = query.value(0).toInt();
ticket.routeId = query.value(1).toInt();
ticket.routeName = query.value(2).toString();
ticket.passengerName = query.value(3).toString();
ticket.documentNumber = query.value(4).toString();
ticket.seatCount = query.value(5).toInt();
ticket.totalPrice = query.value(6).toDouble();
ticket.sellerId = query.value(7).toInt();
ticket.sellerName = query.value(8).toString();
ticket.saleDate = query.value(9).toString();
tickets.append(ticket);
}
return tickets;
}
bool Database::addTicket(int routeId, const QString& passengerName,
const QString& documentNumber, int seatCount, int sellerId) {
Route route = getRoute(routeId);
double totalPrice = route.price * seatCount;
QSqlQuery query(m_db);
query.prepare("INSERT INTO tickets (route_id, passenger_name, document_number, "
"seat_count, total_price, seller_id, sale_date) VALUES (?, ?, ?, ?, ?, ?, ?)");
query.addBindValue(routeId);
query.addBindValue(passengerName);
query.addBindValue(documentNumber);
query.addBindValue(seatCount);
query.addBindValue(totalPrice);
query.addBindValue(sellerId);
query.addBindValue(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss"));
if (query.exec()) {
return updateAvailableSeats(routeId, -seatCount);
}
return false;
}
bool Database::deleteTicket(int id) {
QSqlQuery query(m_db);
query.prepare("SELECT route_id, seat_count FROM tickets WHERE id = ?");
query.addBindValue(id);
if (query.exec() && query.next()) {
int routeId = query.value(0).toInt();
int seatCount = query.value(1).toInt();
query.prepare("DELETE FROM tickets WHERE id = ?");
query.addBindValue(id);
if (query.exec()) {
return updateAvailableSeats(routeId, seatCount);
}
}
return false;
}
int Database::getLastTicketId() {
QSqlQuery query("SELECT last_insert_rowid()", m_db);
if (query.next()) {
return query.value(0).toInt();
}
return -1;
}

77
database.h Normal file
View File

@@ -0,0 +1,77 @@
#ifndef DATABASE_H
#define DATABASE_H
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>
#include <QFile>
#include <QCryptographicHash>
struct User {
int id;
QString username;
QString password;
QString role;
};
struct Route {
int id;
QString routeName;
QString departureTime;
double price;
int totalSeats;
int availableSeats;
};
struct Ticket {
int id;
int routeId;
QString routeName;
QString passengerName;
QString documentNumber;
int seatCount;
double totalPrice;
int sellerId;
QString sellerName;
QString saleDate;
};
class Database {
public:
static Database& instance();
bool initialize();
bool authenticate(const QString& username, const QString& password);
User getUser(const QString& username);
QVector<User> getAllUsers();
bool addUser(const QString& username, const QString& password, const QString& role);
bool deleteUser(int id);
QVector<Route> getAllRoutes();
Route getRoute(int id);
bool addRoute(const QString& routeName, const QString& departureTime,
double price, int totalSeats);
bool updateRoute(const Route& route);
bool deleteRoute(int id);
bool updateAvailableSeats(int routeId, int change);
QVector<Ticket> getTicketsByRoute(int routeId);
QVector<Ticket> getAllTickets();
bool addTicket(int routeId, const QString& passengerName,
const QString& documentNumber, int seatCount,
int sellerId);
bool deleteTicket(int id);
int getLastTicketId();
private:
Database() = default;
~Database() = default;
Database(const Database&) = delete;
Database& operator=(const Database&) = delete;
QSqlDatabase m_db;
QString hashPassword(const QString& password);
};
#endif

107
loginwindow.cpp Normal file
View File

@@ -0,0 +1,107 @@
#include "loginwindow.h"
#include "database.h"
#include <QMessageBox>
LoginWindow::LoginWindow(QWidget* parent)
: QDialog(parent), isRegistering(false)
{
setWindowTitle("Авторизация - Система вокзала");
setFixedSize(400, 280);
setModal(true);
QVBoxLayout* mainLayout = new QVBoxLayout(this);
mainLayout->setSpacing(15);
mainLayout->setContentsMargins(30, 30, 30, 30);
QLabel* titleLabel = new QLabel("Система учета вокзала", this);
titleLabel->setAlignment(Qt::AlignCenter);
titleLabel->setStyleSheet("font-size: 18px; font-weight: bold;");
mainLayout->addWidget(titleLabel);
QLabel* userLabel = new QLabel("Логин:", this);
m_usernameEdit = new QLineEdit(this);
m_usernameEdit->setPlaceholderText("Введите логин");
mainLayout->addWidget(userLabel);
mainLayout->addWidget(m_usernameEdit);
QLabel* passLabel = new QLabel("Пароль:", this);
m_passwordEdit = new QLineEdit(this);
m_passwordEdit->setPlaceholderText("Введите пароль");
m_passwordEdit->setEchoMode(QLineEdit::Password);
mainLayout->addWidget(passLabel);
mainLayout->addWidget(m_passwordEdit);
m_messageLabel = new QLabel(this);
m_messageLabel->setAlignment(Qt::AlignCenter);
m_messageLabel->setStyleSheet("color: red;");
mainLayout->addWidget(m_messageLabel);
QHBoxLayout* btnLayout = new QHBoxLayout();
m_loginBtn = new QPushButton("Войти", this);
m_registerBtn = new QPushButton("Регистрация", this);
btnLayout->addWidget(m_loginBtn);
btnLayout->addWidget(m_registerBtn);
mainLayout->addLayout(btnLayout);
connect(m_loginBtn, &QPushButton::clicked, this, &LoginWindow::onLoginClicked);
connect(m_registerBtn, &QPushButton::clicked, this, &LoginWindow::onRegisterClicked);
}
void LoginWindow::onLoginClicked() {
QString username = m_usernameEdit->text().trimmed();
QString password = m_passwordEdit->text();
if (username.isEmpty() || password.isEmpty()) {
m_messageLabel->setText("Заполните все поля!");
return;
}
if (Database::instance().authenticate(username, password)) {
User user = Database::instance().getUser(username);
m_username = user.username;
m_role = user.role;
accept();
} else {
m_messageLabel->setText("Неверный логин или пароль!");
m_passwordEdit->clear();
}
}
void LoginWindow::onRegisterClicked() {
if (!isRegistering) {
isRegistering = true;
m_loginBtn->setText("Зарегистрироваться");
m_registerBtn->setText("Отмена");
m_messageLabel->setText("Регистрация нового пользователя");
m_messageLabel->setStyleSheet("color: green;");
} else {
QString username = m_usernameEdit->text().trimmed();
QString password = m_passwordEdit->text();
if (username.isEmpty() || password.isEmpty()) {
m_messageLabel->setText("Заполните все поля!");
m_messageLabel->setStyleSheet("color: red;");
return;
}
if (password.length() < 4) {
m_messageLabel->setText("Пароль должен быть >= 4 символов!");
m_messageLabel->setStyleSheet("color: red;");
return;
}
if (Database::instance().addUser(username, password, "cashier")) {
QMessageBox::information(this, "Успех", "Пользователь зарегистрирован!");
isRegistering = false;
m_loginBtn->setText("Войти");
m_registerBtn->setText("Регистрация");
m_messageLabel->setText("");
m_messageLabel->setStyleSheet("color: red;");
m_usernameEdit->clear();
m_passwordEdit->clear();
} else {
m_messageLabel->setText("Ошибка: пользователь уже существует!");
m_messageLabel->setStyleSheet("color: red;");
}
}
}

38
loginwindow.h Normal file
View File

@@ -0,0 +1,38 @@
#ifndef LOGINWINDOW_H
#define LOGINWINDOW_H
#include <QDialog>
#include <QLineEdit>
#include <QPushButton>
#include <QLabel>
#include <QVBoxLayout>
#include <QHBoxLayout>
class LoginWindow : public QDialog {
Q_OBJECT
public:
explicit LoginWindow(QWidget* parent = nullptr);
QString getUsername() const { return m_username; }
QString getRole() const { return m_role; }
signals:
void loginSuccessful();
private slots:
void onLoginClicked();
void onRegisterClicked();
private:
QLineEdit* m_usernameEdit;
QLineEdit* m_passwordEdit;
QPushButton* m_loginBtn;
QPushButton* m_registerBtn;
QLabel* m_messageLabel;
QString m_username;
QString m_role;
bool isRegistering;
};
#endif

28
main.cpp Normal file
View File

@@ -0,0 +1,28 @@
#include <QApplication>
#include <QMessageBox>
#include "database.h"
#include "loginwindow.h"
#include "mainwindow.h"
int main(int argc, char* argv[]) {
QApplication a(argc, argv);
a.setApplicationName("StationManager");
a.setOrganizationName("Station");
if (!Database::instance().initialize()) {
QMessageBox::critical(nullptr, "Ошибка",
"Не удалось инициализировать базу данных!");
return 1;
}
LoginWindow login;
if (login.exec() != QDialog::Accepted) {
return 0;
}
MainWindow w(login.getUsername(), login.getRole());
w.show();
return QApplication::exec();
}

84
mainwindow.cpp Normal file
View File

@@ -0,0 +1,84 @@
#include "mainwindow.h"
#include "routeswidget.h"
#include "ticketswidget.h"
#include "printwidget.h"
#include "userswidget.h"
#include "database.h"
#include <QMenuBar>
#include <QMenu>
#include <QAction>
#include <QApplication>
MainWindow::MainWindow(const QString& username, const QString& role, QWidget* parent)
: QMainWindow(parent), m_username(username), m_role(role)
{
setWindowTitle("Система учета вокзала");
setMinimumSize(900, 600);
User user = Database::instance().getUser(username);
m_userId = user.id;
QMenuBar* menuBar = this->menuBar();
QMenu* menu = menuBar->addMenu("Меню");
QAction* routesAction = menu->addAction("Управление рейсами");
QAction* ticketsAction = menu->addAction("Продажа билетов");
QAction* printAction = menu->addAction("Печать билетов");
menu->addSeparator();
QAction* logoutAction = menu->addAction("Выйти");
connect(routesAction, &QAction::triggered, this, &MainWindow::showRoutes);
connect(ticketsAction, &QAction::triggered, this, &MainWindow::showTickets);
connect(printAction, &QAction::triggered, this, &MainWindow::showPrint);
connect(logoutAction, &QAction::triggered, this, &MainWindow::logout);
m_stack = new QStackedWidget(this);
setCentralWidget(m_stack);
m_routesWidget = new RoutesWidget(this);
m_ticketsWidget = new TicketsWidget(this);
m_printWidget = new PrintWidget(this);
m_usersWidget = new UsersWidget(this);
m_stack->addWidget(m_routesWidget);
m_stack->addWidget(m_ticketsWidget);
m_stack->addWidget(m_printWidget);
m_stack->addWidget(m_usersWidget);
m_statusLabel = new QLabel(QString("Пользователь: %1 | Роль: %2").arg(username, role));
statusBar()->addWidget(m_statusLabel);
if (role == "admin") {
QMenu* userMenu = new QMenu("Пользователи", menuBar);
QAction* usersAction = menu->insertMenu(printAction, userMenu);
QAction* manageUsersAction = userMenu->addAction("Управление пользователями");
connect(manageUsersAction, &QAction::triggered, this, &MainWindow::showUsers);
} else {
m_usersWidget->setVisible(false);
}
showRoutes();
}
void MainWindow::showRoutes() {
m_stack->setCurrentWidget(m_routesWidget);
}
void MainWindow::showTickets() {
m_ticketsWidget->refreshRoutes();
m_stack->setCurrentWidget(m_ticketsWidget);
}
void MainWindow::showPrint() {
m_printWidget->refreshRoutes();
m_stack->setCurrentWidget(m_printWidget);
}
void MainWindow::showUsers() {
m_usersWidget->refreshUsers();
m_stack->setCurrentWidget(m_usersWidget);
}
void MainWindow::logout() {
QApplication::quit();
}

43
mainwindow.h Normal file
View File

@@ -0,0 +1,43 @@
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QStackedWidget>
#include <QMenuBar>
#include <QStatusBar>
#include <QLabel>
class RoutesWidget;
class TicketsWidget;
class PrintWidget;
class UsersWidget;
class MainWindow : public QMainWindow {
Q_OBJECT
public:
explicit MainWindow(const QString& username, const QString& role, QWidget* parent = nullptr);
QString currentUser() const { return m_username; }
int currentUserId() const { return m_userId; }
QString currentRole() const { return m_role; }
public slots:
void showRoutes();
void showTickets();
void showPrint();
void showUsers();
void logout();
private:
QStackedWidget* m_stack;
RoutesWidget* m_routesWidget;
TicketsWidget* m_ticketsWidget;
PrintWidget* m_printWidget;
UsersWidget* m_usersWidget;
QLabel* m_statusLabel;
QString m_username;
QString m_role;
int m_userId;
};
#endif

145
printwidget.cpp Normal file
View File

@@ -0,0 +1,145 @@
#include "printwidget.h"
#include "database.h"
#include <QTableWidget>
#include <QHeaderView>
#include <QFileDialog>
#include <QMessageBox>
#include <QTextStream>
#include <QDateTime>
PrintWidget::PrintWidget(QWidget* parent) : QWidget(parent) {
QVBoxLayout* mainLayout = new QVBoxLayout(this);
QLabel* title = new QLabel("Печать списка билетов", this);
title->setStyleSheet("font-size: 20px; font-weight: bold;");
mainLayout->addWidget(title);
QHBoxLayout* filterLayout = new QHBoxLayout();
QLabel* routeLabel = new QLabel("Выберите рейс:", this);
m_routeCombo = new QComboBox(this);
filterLayout->addWidget(routeLabel);
filterLayout->addWidget(m_routeCombo);
filterLayout->addStretch();
mainLayout->addLayout(filterLayout);
m_table = new QTableWidget(this);
m_table->setColumnCount(8);
m_table->setHorizontalHeaderLabels({"ID", "Маршрут", "Время", "Пассажир", "Документ", "Билетов", "Сумма", "Кассир"});
m_table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
m_table->setSelectionBehavior(QAbstractItemView::SelectRows);
m_table->setEditTriggers(QAbstractItemView::NoEditTriggers);
mainLayout->addWidget(m_table);
m_totalLabel = new QLabel("Итого: 0 билетов на сумму 0.00 руб.", this);
m_totalLabel->setStyleSheet("font-weight: bold; font-size: 14px;");
mainLayout->addWidget(m_totalLabel);
QHBoxLayout* btnLayout = new QHBoxLayout();
QPushButton* refreshBtn = new QPushButton("Обновить", this);
QPushButton* printBtn = new QPushButton("Экспорт в файл", this);
btnLayout->addWidget(refreshBtn);
btnLayout->addWidget(printBtn);
btnLayout->addStretch();
mainLayout->addLayout(btnLayout);
connect(m_routeCombo, QOverload<int>::of(&QComboBox::currentIndexChanged),
this, &PrintWidget::onRouteChanged);
connect(refreshBtn, &QPushButton::clicked, this, [this]() {
refreshRoutes();
onRouteChanged(m_routeCombo->currentIndex());
});
connect(printBtn, &QPushButton::clicked, this, &PrintWidget::onPrintClicked);
}
void PrintWidget::refreshRoutes() {
m_routeCombo->clear();
QVector<Route> routes = Database::instance().getAllRoutes();
for (const auto& route : routes) {
m_routeCombo->addItem(QString("%1 - %2").arg(route.routeName).arg(route.departureTime), route.id);
}
}
void PrintWidget::onRouteChanged(int index) {
if (index < 0) return;
int routeId = m_routeCombo->currentData().toInt();
loadTickets(routeId);
}
void PrintWidget::loadTickets(int routeId) {
QVector<Ticket> tickets = Database::instance().getTicketsByRoute(routeId);
m_table->setRowCount(tickets.size());
qDebug() << "TICKET COUNT:" + std::to_string(tickets.length()) + " " + std::to_string(routeId);
double total = 0;
int totalSeats = 0;
for (int i = 0; i < tickets.size(); ++i) {
const Ticket& ticket = tickets[i];
m_table->setItem(i, 0, new QTableWidgetItem(QString::number(ticket.id)));
m_table->setItem(i, 1, new QTableWidgetItem(ticket.routeName));
m_table->setItem(i, 2, new QTableWidgetItem(ticket.saleDate));
m_table->setItem(i, 3, new QTableWidgetItem(ticket.passengerName));
m_table->setItem(i, 4, new QTableWidgetItem(ticket.documentNumber));
m_table->setItem(i, 5, new QTableWidgetItem(QString::number(ticket.seatCount)));
m_table->setItem(i, 6, new QTableWidgetItem(QString::number(ticket.totalPrice, 'f', 2)));
m_table->setItem(i, 7, new QTableWidgetItem(ticket.sellerName));
total += ticket.totalPrice;
totalSeats += ticket.seatCount;
}
m_totalLabel->setText(QString("Итого: %1 билетов на сумму %2 руб.")
.arg(totalSeats)
.arg(total, 0, 'f', 2));
}
void PrintWidget::onPrintClicked() {
if (m_table->rowCount() == 0) {
QMessageBox::warning(this, "Внимание", "Нет данных для печати!");
return;
}
QString fileName = QFileDialog::getSaveFileName(
this, "Сохранить список билетов",
QString("tickets_%1.txt").arg(QDateTime::currentDateTime().toString("yyyyMMdd_HHmmss")),
"Text Files (*.txt)");
if (fileName.isEmpty()) return;
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
QMessageBox::critical(this, "Ошибка", "Не удалось создать файл!");
return;
}
QTextStream out(&file);
out << "===========================================\n";
out << " СПИСОК ПРОДАННЫХ БИЛЕТОВ\n";
out << "===========================================\n";
out << "Рейс: " << m_routeCombo->currentText() << "\n";
out << "Дата формирования: " << QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss") << "\n";
out << "===========================================\n\n";
int totalSeats = 0;
double totalSum = 0;
for (int i = 0; i < m_table->rowCount(); ++i) {
out << QString("Билет #%1\n").arg(m_table->item(i, 0)->text());
out << QString(" Пассажир: %1\n").arg(m_table->item(i, 3)->text());
out << QString(" Документ: %1\n").arg(m_table->item(i, 4)->text());
out << QString(" Количество: %1 шт.\n").arg(m_table->item(i, 5)->text());
out << QString(" Сумма: %1 руб.\n").arg(m_table->item(i, 6)->text());
out << QString(" Продал: %1 (%2)\n").arg(m_table->item(i, 7)->text()).arg(m_table->item(i, 2)->text());
out << "-----------------------------------------\n";
totalSeats += m_table->item(i, 5)->text().toInt();
totalSum += m_table->item(i, 6)->text().toDouble();
}
out << "\n===========================================\n";
out << QString("ИТОГО: %1 билетов на сумму %2 руб.\n").arg(totalSeats).arg(totalSum, 0, 'f', 2);
out << "===========================================\n";
file.close();
QMessageBox::information(this, "Успех", QString("Файл сохранен:\n%1").arg(fileName));
}

31
printwidget.h Normal file
View File

@@ -0,0 +1,31 @@
#ifndef PRINTWIDGET_H
#define PRINTWIDGET_H
#include <QWidget>
#include <QComboBox>
#include <QTableWidget>
#include <QPushButton>
#include <QLabel>
#include <QVBoxLayout>
#include <QHBoxLayout>
class PrintWidget : public QWidget {
Q_OBJECT
public:
explicit PrintWidget(QWidget* parent = nullptr);
void refreshRoutes();
private slots:
void onRouteChanged(int index);
void onPrintClicked();
private:
void loadTickets(int routeId);
QComboBox* m_routeCombo;
QTableWidget* m_table;
QLabel* m_totalLabel;
};
#endif

160
routeswidget.cpp Normal file
View File

@@ -0,0 +1,160 @@
#include "routeswidget.h"
#include "database.h"
#include <QTableWidget>
#include <QHeaderView>
#include <QMessageBox>
#include <QInputDialog>
RoutesWidget::RoutesWidget(QWidget* parent) : QWidget(parent) {
QVBoxLayout* mainLayout = new QVBoxLayout(this);
QLabel* title = new QLabel("Управление рейсами", this);
title->setStyleSheet("font-size: 20px; font-weight: bold;");
mainLayout->addWidget(title);
m_table = new QTableWidget(this);
m_table->setColumnCount(6);
m_table->setHorizontalHeaderLabels({"ID", "Маршрут", "Время отправления", "Цена", "Всего мест", "Свободно"});
m_table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
m_table->setSelectionBehavior(QAbstractItemView::SelectRows);
m_table->setSelectionMode(QAbstractItemView::SingleSelection);
m_table->setEditTriggers(QAbstractItemView::NoEditTriggers);
mainLayout->addWidget(m_table);
QHBoxLayout* btnLayout = new QHBoxLayout();
m_addBtn = new QPushButton("Добавить", this);
m_editBtn = new QPushButton("Редактировать", this);
m_deleteBtn = new QPushButton("Удалить", this);
btnLayout->addWidget(m_addBtn);
btnLayout->addWidget(m_editBtn);
btnLayout->addWidget(m_deleteBtn);
btnLayout->addStretch();
mainLayout->addLayout(btnLayout);
connect(m_addBtn, &QPushButton::clicked, this, &RoutesWidget::onAddClicked);
connect(m_editBtn, &QPushButton::clicked, this, &RoutesWidget::onEditClicked);
connect(m_deleteBtn, &QPushButton::clicked, this, &RoutesWidget::onDeleteClicked);
loadRoutes();
}
void RoutesWidget::loadRoutes() {
QVector<Route> routes = Database::instance().getAllRoutes();
m_table->setRowCount(routes.size());
for (int i = 0; i < routes.size(); ++i) {
const Route& route = routes[i];
m_table->setItem(i, 0, new QTableWidgetItem(QString::number(route.id)));
m_table->setItem(i, 1, new QTableWidgetItem(route.routeName));
m_table->setItem(i, 2, new QTableWidgetItem(route.departureTime));
m_table->setItem(i, 3, new QTableWidgetItem(QString::number(route.price, 'f', 2)));
m_table->setItem(i, 4, new QTableWidgetItem(QString::number(route.totalSeats)));
m_table->setItem(i, 5, new QTableWidgetItem(QString::number(route.availableSeats)));
}
}
void RoutesWidget::onAddClicked() {
RouteDialog dialog;
if (dialog.exec() == QDialog::Accepted) {
if (Database::instance().addRoute(
dialog.getRouteName(),
dialog.getDepartureTime(),
dialog.getPrice(),
dialog.getTotalSeats())) {
loadRoutes();
QMessageBox::information(this, "Успех", "Рейс добавлен!");
}
}
}
void RoutesWidget::onEditClicked() {
int row = m_table->currentRow();
if (row < 0) {
QMessageBox::warning(this, "Ошибка", "Выберите рейс для редактирования!");
return;
}
int id = m_table->item(row, 0)->text().toInt();
Route route = Database::instance().getRoute(id);
RouteDialog dialog(&route, this);
if (dialog.exec() == QDialog::Accepted) {
route.routeName = dialog.getRouteName();
route.departureTime = dialog.getDepartureTime();
route.price = dialog.getPrice();
if (route.totalSeats != dialog.getTotalSeats()) {
int diff = dialog.getTotalSeats() - route.totalSeats;
route.totalSeats = dialog.getTotalSeats();
route.availableSeats += diff;
if (route.availableSeats < 0) route.availableSeats = 0;
}
if (Database::instance().updateRoute(route)) {
loadRoutes();
QMessageBox::information(this, "Успех", "Рейс обновлен!");
}
}
}
void RoutesWidget::onDeleteClicked() {
int row = m_table->currentRow();
if (row < 0) {
QMessageBox::warning(this, "Ошибка", "Выберите рейс для удаления!");
return;
}
int id = m_table->item(row, 0)->text().toInt();
QMessageBox::StandardButton reply = QMessageBox::question(
this, "Подтверждение", "Удалить выбранный рейс?",
QMessageBox::Yes | QMessageBox::No);
if (reply == QMessageBox::Yes) {
if (Database::instance().deleteRoute(id)) {
loadRoutes();
QMessageBox::information(this, "Успех", "Рейс удален!");
}
}
}
RouteDialog::RouteDialog(Route* route, QWidget* parent)
: QDialog(parent)
{
setWindowTitle(route ? "Редактирование рейса" : "Добавление рейса");
setFixedSize(400, 250);
QFormLayout* form = new QFormLayout(this);
m_nameEdit = new QLineEdit(this);
m_dateTimeEdit = new QDateTimeEdit(this);
m_dateTimeEdit->setCalendarPopup(true);
m_dateTimeEdit->setDateTime(QDateTime::currentDateTime().addDays(1));
m_priceEdit = new QLineEdit(this);
m_priceEdit->setPlaceholderText("0.00");
m_seatsEdit = new QLineEdit(this);
m_seatsEdit->setPlaceholderText("100");
if (route) {
m_nameEdit->setText(route->routeName);
m_dateTimeEdit->setDateTime(QDateTime::fromString(route->departureTime, "yyyy-MM-dd HH:mm:ss"));
m_priceEdit->setText(QString::number(route->price, 'f', 2));
m_seatsEdit->setText(QString::number(route->totalSeats));
}
form->addRow("Маршрут:", m_nameEdit);
form->addRow("Время отправления:", m_dateTimeEdit);
form->addRow("Цена билета:", m_priceEdit);
form->addRow("Всего мест:", m_seatsEdit);
QHBoxLayout* btnLayout = new QHBoxLayout();
QPushButton* okBtn = new QPushButton("ОК", this);
QPushButton* cancelBtn = new QPushButton("Отмена", this);
btnLayout->addStretch();
btnLayout->addWidget(okBtn);
btnLayout->addWidget(cancelBtn);
form->addRow(btnLayout);
connect(okBtn, &QPushButton::clicked, this, &QDialog::accept);
connect(cancelBtn, &QPushButton::clicked, this, &QDialog::reject);
}

54
routeswidget.h Normal file
View File

@@ -0,0 +1,54 @@
#ifndef ROUTESWIDGET_H
#define ROUTESWIDGET_H
#include <QWidget>
#include <QTableWidget>
#include <QPushButton>
#include <QLineEdit>
#include <QDateTimeEdit>
#include <QLabel>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QFormLayout>
#include <QDialog>
struct Route;
class RoutesWidget : public QWidget {
Q_OBJECT
public:
explicit RoutesWidget(QWidget* parent = nullptr);
private slots:
void loadRoutes();
void onAddClicked();
void onEditClicked();
void onDeleteClicked();
private:
void showAddEditDialog(Route* route = nullptr);
QTableWidget* m_table;
QPushButton* m_addBtn;
QPushButton* m_editBtn;
QPushButton* m_deleteBtn;
};
class RouteDialog : public QDialog {
Q_OBJECT
public:
explicit RouteDialog(Route* route = nullptr, QWidget* parent = nullptr);
QString getRouteName() const { return m_nameEdit->text(); }
QString getDepartureTime() const { return m_dateTimeEdit->text(); }
double getPrice() const { return m_priceEdit->text().toDouble(); }
int getTotalSeats() const { return m_seatsEdit->text().toInt(); }
private:
QLineEdit* m_nameEdit;
QDateTimeEdit* m_dateTimeEdit;
QLineEdit* m_priceEdit;
QLineEdit* m_seatsEdit;
};
#endif

136
ticketswidget.cpp Normal file
View File

@@ -0,0 +1,136 @@
#include "ticketswidget.h"
#include "database.h"
#include "mainwindow.h"
#include <QTableWidget>
#include <QHeaderView>
#include <QMessageBox>
#include <QGroupBox>
TicketsWidget::TicketsWidget(QWidget* parent) : QWidget(parent) {
auto* mainLayout = new QVBoxLayout(this);
auto* title = new QLabel("Продажа билетов", this);
title->setStyleSheet("font-size: 20px; font-weight: bold;");
mainLayout->addWidget(title);
auto* sellGroup = new QGroupBox("Новый билет", this);
auto* sellForm = new QFormLayout(sellGroup);
m_routeCombo = new QComboBox(this);
m_routeInfo = new QLabel("Выберите рейс", this);
m_passengerName = new QLineEdit(this);
m_passengerName->setPlaceholderText("Иванов Иван Иванович");
m_documentNumber = new QLineEdit(this);
m_documentNumber->setPlaceholderText("Серия и номер паспорта");
m_seatCount = new QSpinBox(this);
m_seatCount->setMinimum(1);
m_seatCount->setMaximum(10);
m_totalPrice = new QLabel("0.00 руб.", this);
m_sellBtn = new QPushButton("Продать билет", this);
sellForm->addRow("Рейс:", m_routeCombo);
sellForm->addRow("", m_routeInfo);
sellForm->addRow("ФИО пассажира:", m_passengerName);
sellForm->addRow("Документ:", m_documentNumber);
sellForm->addRow("Количество билетов:", m_seatCount);
sellForm->addRow("Итого:", m_totalPrice);
sellForm->addRow("", m_sellBtn);
mainLayout->addWidget(sellGroup);
connect(m_routeCombo, QOverload<int>::of(&QComboBox::currentIndexChanged),
this, &TicketsWidget::onRouteChanged);
connect(m_seatCount, QOverload<int>::of(&QSpinBox::valueChanged),
this, &TicketsWidget::onRouteChanged);
connect(m_sellBtn, &QPushButton::clicked, this, &TicketsWidget::onSellClicked);
auto* ticketsLabel = new QLabel("Проданные билеты на выбранный рейс", this);
ticketsLabel->setStyleSheet("font-weight: bold;");
mainLayout->addWidget(ticketsLabel);
m_ticketsTable = new QTableWidget(this);
m_ticketsTable->setColumnCount(6);
m_ticketsTable->setHorizontalHeaderLabels({"ID", "Пассажир", "Документ", "Билетов", "Сумма", "Продано"});
m_ticketsTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
m_ticketsTable->setSelectionBehavior(QAbstractItemView::SelectRows);
m_ticketsTable->setEditTriggers(QAbstractItemView::NoEditTriggers);
mainLayout->addWidget(m_ticketsTable);
refreshRoutes();
}
void TicketsWidget::refreshRoutes() {
m_routeCombo->clear();
QVector<Route> routes = Database::instance().getAllRoutes();
for (const auto& route : routes) {
m_routeCombo->addItem(QString("%1 - %2").arg(route.routeName).arg(route.departureTime), route.id);
}
}
void TicketsWidget::onRouteChanged(int index) {
if (index < 0) return;
int routeId = m_routeCombo->currentData().toInt();
Route route = Database::instance().getRoute(routeId);
m_routeInfo->setText(QString("Цена: %1 руб. | Свободно: %2 мест")
.arg(route.price, 0, 'f', 2)
.arg(route.availableSeats));
m_seatCount->setMaximum(qMin(10, route.availableSeats));
double total = route.price * m_seatCount->value();
m_totalPrice->setText(QString("%1 руб.").arg(total, 0, 'f', 2));
QVector<Ticket> tickets = Database::instance().getTicketsByRoute(routeId);
m_ticketsTable->setRowCount(tickets.size());
for (int i = 0; i < tickets.size(); ++i) {
const Ticket& ticket = tickets[i];
m_ticketsTable->setItem(i, 0, new QTableWidgetItem(QString::number(ticket.id)));
m_ticketsTable->setItem(i, 1, new QTableWidgetItem(ticket.passengerName));
m_ticketsTable->setItem(i, 2, new QTableWidgetItem(ticket.documentNumber));
m_ticketsTable->setItem(i, 3, new QTableWidgetItem(QString::number(ticket.seatCount)));
m_ticketsTable->setItem(i, 4, new QTableWidgetItem(QString::number(ticket.totalPrice, 'f', 2)));
m_ticketsTable->setItem(i, 5, new QTableWidgetItem(ticket.saleDate));
}
}
void TicketsWidget::onSellClicked() {
int routeId = m_routeCombo->currentData().toInt();
Route route = Database::instance().getRoute(routeId);
QString passengerName = m_passengerName->text().trimmed();
QString documentNumber = m_documentNumber->text().trimmed();
int seatCount = m_seatCount->value();
if (passengerName.isEmpty() || documentNumber.isEmpty()) {
QMessageBox::warning(this, "Ошибка", "Заполните все поля!");
return;
}
if (seatCount > route.availableSeats) {
QMessageBox::warning(this, "Ошибка",
QString("Недостаточно мест! Доступно: %1").arg(route.availableSeats));
return;
}
MainWindow* mainWin = qobject_cast<MainWindow*>(window());
int sellerId = mainWin ? mainWin->currentUserId() : 1;
if (Database::instance().addTicket(routeId, passengerName, documentNumber, seatCount, sellerId)) {
QMessageBox::information(this, "Успех",
QString("Продано %1 билет(а) на сумму %2 руб.")
.arg(seatCount)
.arg(route.price * seatCount, 0, 'f', 2));
m_passengerName->clear();
m_documentNumber->clear();
m_seatCount->setValue(1);
refreshRoutes();
onRouteChanged(m_routeCombo->currentIndex());
} else {
QMessageBox::critical(this, "Ошибка", "Не удалось продать билет!");
}
}

37
ticketswidget.h Normal file
View File

@@ -0,0 +1,37 @@
#ifndef TICKETSWIDGET_H
#define TICKETSWIDGET_H
#include <QWidget>
#include <QTableWidget>
#include <QComboBox>
#include <QSpinBox>
#include <QLineEdit>
#include <QPushButton>
#include <QLabel>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QFormLayout>
class TicketsWidget : public QWidget {
Q_OBJECT
public:
explicit TicketsWidget(QWidget* parent = nullptr);
void refreshRoutes();
private slots:
void onRouteChanged(int index);
void onSellClicked();
private:
QComboBox* m_routeCombo;
QLabel* m_routeInfo;
QLineEdit* m_passengerName;
QLineEdit* m_documentNumber;
QSpinBox* m_seatCount;
QLabel* m_totalPrice;
QPushButton* m_sellBtn;
QTableWidget* m_ticketsTable;
};
#endif

98
userswidget.cpp Normal file
View File

@@ -0,0 +1,98 @@
#include "userswidget.h"
#include "database.h"
#include <QTableWidget>
#include <QHeaderView>
#include <QMessageBox>
#include <QInputDialog>
#include <QLabel>
UsersWidget::UsersWidget(QWidget* parent) : QWidget(parent) {
QVBoxLayout* mainLayout = new QVBoxLayout(this);
QLabel* title = new QLabel("Управление пользователями", this);
title->setStyleSheet("font-size: 20px; font-weight: bold;");
mainLayout->addWidget(title);
m_table = new QTableWidget(this);
m_table->setColumnCount(3);
m_table->setHorizontalHeaderLabels({"ID", "Логин", "Роль"});
m_table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
m_table->setSelectionBehavior(QAbstractItemView::SelectRows);
m_table->setSelectionMode(QAbstractItemView::SingleSelection);
m_table->setEditTriggers(QAbstractItemView::NoEditTriggers);
mainLayout->addWidget(m_table);
QHBoxLayout* btnLayout = new QHBoxLayout();
m_addBtn = new QPushButton("Добавить пользователя", this);
m_deleteBtn = new QPushButton("Удалить пользователя", this);
btnLayout->addWidget(m_addBtn);
btnLayout->addWidget(m_deleteBtn);
btnLayout->addStretch();
mainLayout->addLayout(btnLayout);
connect(m_addBtn, &QPushButton::clicked, this, &UsersWidget::onAddClicked);
connect(m_deleteBtn, &QPushButton::clicked, this, &UsersWidget::onDeleteClicked);
refreshUsers();
}
void UsersWidget::refreshUsers() {
QVector<User> users = Database::instance().getAllUsers();
m_table->setRowCount(users.size());
for (int i = 0; i < users.size(); ++i) {
const User& user = users[i];
m_table->setItem(i, 0, new QTableWidgetItem(QString::number(user.id)));
m_table->setItem(i, 1, new QTableWidgetItem(user.username));
m_table->setItem(i, 2, new QTableWidgetItem(user.role == "admin" ? "Администратор" : "Кассир"));
}
}
void UsersWidget::onAddClicked() {
QString username = QInputDialog::getText(this, "Новый пользователь", "Логин:");
if (username.isEmpty()) return;
QString password = QInputDialog::getText(this, "Новый пользователь", "Пароль:", QLineEdit::Password);
if (password.isEmpty()) return;
QStringList roles = {"cashier", "admin"};
QString role = QInputDialog::getItem(this, "Новый пользователь", "Роль:", roles, 0, false);
if (role.isEmpty()) return;
if (Database::instance().addUser(username, password, role)) {
QMessageBox::information(this, "Успех", "Пользователь добавлен!");
refreshUsers();
} else {
QMessageBox::critical(this, "Ошибка", "Пользователь с таким логином уже существует!");
}
}
void UsersWidget::onDeleteClicked() {
int row = m_table->currentRow();
if (row < 0) {
QMessageBox::warning(this, "Ошибка", "Выберите пользователя!");
return;
}
QString username = m_table->item(row, 1)->text();
QString role = m_table->item(row, 2)->text();
if (role == "Администратор") {
QMessageBox::warning(this, "Ошибка", "Нельзя удалить администратора!");
return;
}
int id = m_table->item(row, 0)->text().toInt();
QMessageBox::StandardButton reply = QMessageBox::question(
this, "Подтверждение",
QString("Удалить пользователя '%1'?").arg(username),
QMessageBox::Yes | QMessageBox::No);
if (reply == QMessageBox::Yes) {
if (Database::instance().deleteUser(id)) {
QMessageBox::information(this, "Успех", "Пользователь удален!");
refreshUsers();
}
}
}

27
userswidget.h Normal file
View File

@@ -0,0 +1,27 @@
#ifndef USERSWIDGET_H
#define USERSWIDGET_H
#include <QWidget>
#include <QTableWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
class UsersWidget : public QWidget {
Q_OBJECT
public:
explicit UsersWidget(QWidget* parent = nullptr);
void refreshUsers();
private slots:
void onAddClicked();
void onDeleteClicked();
private:
QTableWidget* m_table;
QPushButton* m_addBtn;
QPushButton* m_deleteBtn;
};
#endif