mirror of
https://github.com/f4exb/sdrangel.git
synced 2026-01-16 18:45:37 -05:00
140 lines
6.6 KiB
Markdown
140 lines
6.6 KiB
Markdown
---
|
|
applyTo: '**/*.cpp, **/*.h, **/*.hpp, **/*.cxx, **/*.cc'
|
|
---
|
|
# Qt C++ & SDRangel App coding conventions and guidelines
|
|
|
|
These instructions guide Copilot to generate code that aligns with modern Qt C++ standards, C++20/23 features, software engineering principles, and industry best practices to improve software quality, maintainability, and performance for the SDRangel application.
|
|
|
|
## ✅ General C++ Coding Standards
|
|
|
|
- Follow **Google C++ Style Guide** or **Core Guidelines** for consistent code structure
|
|
- Use **meaningful, descriptive variable, function, class, and file names**
|
|
- Apply proper Doxygen comments for classes, methods, and complex logic
|
|
- Organize code into small, reusable functions or classes with single responsibility
|
|
- Avoid magic numbers or hard-coded strings; use constants, enums, or configuration
|
|
- Use **RAII** (Resource Acquisition Is Initialization) for all resource management
|
|
- Prefer **const correctness** throughout the codebase
|
|
|
|
## ✅ Modern C++20/23 Best Practices
|
|
|
|
- Use **auto** for type deduction when it improves readability
|
|
- Utilize **smart pointers** (`std::unique_ptr`, `std::shared_ptr`) over raw pointers
|
|
- Apply **range-based for loops** instead of traditional iterator loops
|
|
- Use **constexpr** for compile-time constants and functions
|
|
- Leverage **structured bindings** for tuple/pair unpacking
|
|
- Use **std::optional** for optional values instead of null pointers
|
|
- Apply **concepts** for template constraints where applicable
|
|
- Use **std::span** for safe array/container views
|
|
- Utilize **std::string_view** for read-only string parameters
|
|
- Apply **designated initializers** for struct initialization
|
|
- Use **[[nodiscard]]** attribute for functions whose return values shouldn't be ignored
|
|
|
|
## ✅ Qt Framework Standards & Conventions
|
|
|
|
- Follow Qt's **CamelCase** naming convention for classes and **camelCase** for methods/variables
|
|
- Use Qt's **parent-child ownership model** for automatic memory management
|
|
- Apply **Q_OBJECT** macro for classes that need signals/slots or meta-object features
|
|
- Use **signals and slots** for loose coupling between components
|
|
- Prefer **Qt containers** (`QVector`, `QHash`, `QSet`) over STL containers when integrating with Qt APIs
|
|
- Use **Qt's foreach** or range-based for loops with Qt containers
|
|
- Apply **Qt's string handling** (`QString`, `QStringView`) for Unicode support
|
|
- Use **QPointer** for safe weak references to QObjects
|
|
|
|
## ✅ Project Structure & File Organization
|
|
|
|
- Header files should:
|
|
- Use include guards
|
|
- Forward declare classes when possible
|
|
- Separate public, protected, and private sections clearly
|
|
- Source files should:
|
|
- Include corresponding header files first
|
|
- Group includes: standard library, Qt headers, project headers
|
|
- Organize classes into namespaces when necessary to avoid name collisions
|
|
- Maintain a clear separation between interface (header) and implementation (source) files
|
|
|
|
## ✅ Qt-Specific Patterns for SDRangel
|
|
|
|
- **Main Application Structure**:
|
|
|
|
- Implement proper application lifecycle management
|
|
- Use `QSettings` for persistent configuration storage
|
|
|
|
- **Data Collection & Monitoring**:
|
|
|
|
- Use `QTimer` for periodic data collection
|
|
- Apply `QThread` or `QRunnable` for background processing
|
|
- Use `QMutex` or `QReadWriteLock` for thread synchronization
|
|
- Implement `QFileSystemWatcher` for file monitoring
|
|
|
|
- **UI Components**:
|
|
|
|
- Use `QMainWindow` as the primary window class
|
|
- Apply `QWidget` customization for specialized displays
|
|
- Use `QCharts` for data visualization
|
|
- Implement `QSystemTrayIcon` for background operation
|
|
- Use `QDialog` for settings and configuration windows
|
|
|
|
- **Networking & API Integration**:
|
|
- Use `QNetworkAccessManager` for HTTP requests
|
|
- Apply `QNetworkReply` for handling responses
|
|
- Use `QJsonDocument` and `QJsonObject` for JSON parsing
|
|
- Implement proper SSL/TLS handling with `QSslConfiguration`
|
|
|
|
## ✅ Performance & Memory Management
|
|
|
|
- Use **Qt's object ownership** system to prevent memory leaks
|
|
- Apply **lazy initialization** for expensive resources
|
|
- Use **QObject::deleteLater()** for safe object deletion
|
|
- Implement **efficient string operations** with `QStringBuilder`
|
|
- Use **QCache** for frequently accessed data
|
|
- Apply **QPixmapCache** for image caching
|
|
- Optimize **paint events** with proper clipping and caching
|
|
|
|
## ✅ Cross-Platform Development
|
|
|
|
- Use **Qt's platform abstraction** instead of platform-specific code
|
|
- Apply **conditional compilation** sparingly with `Q_OS_*` macros
|
|
- Use **QStandardPaths** for platform-appropriate file locations
|
|
- Implement **platform-specific features** through Qt's platform plugins
|
|
- Apply **High DPI scaling** support with `Qt::AA_EnableHighDpiScaling`
|
|
|
|
## ✅ Modern Qt Features to Leverage
|
|
|
|
- Use **Qt Quick** for modern, fluid UIs where appropriate
|
|
- Apply **Qt Concurrent** for parallel processing
|
|
- Use **Qt State Machine** for complex state management
|
|
- Apply **Qt's logging framework** with categories
|
|
- Use **Qt's property system** for dynamic behavior
|
|
- Apply **Qt's animation framework** for smooth transitions
|
|
|
|
## ✅ Code Quality & Maintainability
|
|
|
|
- Follow **SOLID Principles** adapted for Qt:
|
|
|
|
- Single Responsibility: Each class has one clear purpose
|
|
- Open/Closed: Use Qt's plugin system for extensions
|
|
- Liskov Substitution: Proper inheritance hierarchies
|
|
- Interface Segregation: Use Qt's abstract base classes
|
|
- Dependency Inversion: Use Qt's dependency injection patterns
|
|
|
|
- Apply **Qt's Model-View patterns** for data presentation
|
|
- Use **Qt's undo framework** for user actions
|
|
- Implement **proper error handling** with Qt's exception safety
|
|
- Apply **const correctness** especially with Qt's implicit sharing
|
|
|
|
## ✅ Additional Copilot Behavior Preferences
|
|
|
|
- Generate **const-correct**, modern C++ code using Qt idioms
|
|
- Prioritize **readable, maintainable** code over premature optimization
|
|
- Avoid deprecated Qt APIs; use modern alternatives
|
|
- Suggest proper class placement based on Qt application structure
|
|
- Default to **Qt's memory management** and **RAII** patterns
|
|
- Include **thread safety considerations** for multi-threaded operations
|
|
- Consider **platform differences** when suggesting system-level code
|
|
- Provide **Doxygen-style documentation** for complex functions
|
|
- Suggest **unit tests** alongside new features where applicable
|
|
- Use **Qt's internationalization** support for user-facing strings
|
|
- Be direct and concise in code comments; avoid unnecessary verbosity
|
|
- Avoid starting responses with "Sure!", "You're right!" or similar phrases; be direct and concise.
|
|
- When writing text that'll be visible to users, use **clear, professional language** without unnecessary exclamations or informalities. Also use Sentence case for titles and headings.
|