卫星终端控制软件_V1.0.4

1、增加号码记录保存,最多保存10条,保存最新的十条;
2、解决方位俯仰显示位置不对的bug
3、优化直方图/方位图的显示
This commit is contained in:
lz
2025-10-14 15:14:38 +08:00
parent fc92b31bed
commit 1ad08b6ed7
4 changed files with 416 additions and 45 deletions

View File

@@ -5,6 +5,18 @@
#include "ui_RecordQuery.h"
#define LIMIT_NUMBER_COUNT 10 //限制号码条目数量
// 返回列名
const char* columnName(NumberKind k) {
switch (k) {
case NumberKind::Call: return "callnumber";
case NumberKind::USMsg: return "u_s_msgnumber";
case NumberKind::BdMsg: return "bd_msgnumber";
}
return "callnumber";
}
RecordQuery::RecordQuery(QWidget *parent)
: QWidget(parent)
, ui(new Ui::RecordQuery)
@@ -24,24 +36,242 @@ RecordQuery::~RecordQuery()
delete ui;
}
void RecordQuery::InitDatabase(){
std::string db_path = QCoreApplication::applicationDirPath().toStdString() + "/record.db";
if(!std::filesystem::exists(db_path)){
sqlite3pp::database db(db_path.c_str());
std::string sql = R"(CREATE TABLE record (
id INTEGER PRIMARY KEY,
begin_time TEXT NOT NULL,
channel INTEGER,
type INTEGER,
direction INTEGER,
number TEXT,
call_duration INTEGER,
content TEXT
);)";
sqlite3pp::command cmd(db, sql.c_str());
const std::string db_path =
(QCoreApplication::applicationDirPath() + "/record.db").toStdString();
// 1. 无条件打开/创建数据库文件SQLite 会在不存在时创建)
m_db = std::make_shared<sqlite3pp::database>(db_path.c_str());
// 2. 始终执行 IF NOT EXISTS确保表存在
const char* sql = R"(CREATE TABLE IF NOT EXISTS record (
id INTEGER PRIMARY KEY,
begin_time TEXT NOT NULL,
channel INTEGER,
type INTEGER,
direction INTEGER,
number TEXT,
call_duration INTEGER,
content TEXT
);)";
sqlite3pp::command cmd(*m_db, sql);
const int rc = cmd.execute();
if (rc != SQLITE_OK) {
QMessageBox::information(this, "错误", "数据表Record创建失败");
}
//电话记录表格
ensureSchema(*m_db);
ensureKeepTop20Triggers(*m_db);
}
// ------------------------ 架构初始化(表 + 唯一索引) ------------------------
void RecordQuery::ensureSchema(sqlite3pp::database& db) {
// 创建表(如果不存在)
{
const char* sql =
"CREATE TABLE IF NOT EXISTS numberRecord ("
" id INTEGER PRIMARY KEY,"
" callnumber TEXT,"
" u_s_msgnumber TEXT,"
" bd_msgnumber TEXT"
");";
sqlite3pp::command cmd(db, sql);
cmd.execute();
}
m_db = std::make_shared<sqlite3pp::database>(db_path.c_str());
// 为每列创建“非空唯一索引”,保证同一类号码不重复
{
sqlite3pp::command idx1(
db,
"CREATE UNIQUE INDEX IF NOT EXISTS idx_callnumber_unique "
"ON numberRecord(callnumber) "
"WHERE callnumber IS NOT NULL;"
);
idx1.execute();
}
{
sqlite3pp::command idx2(
db,
"CREATE UNIQUE INDEX IF NOT EXISTS idx_us_msgnumber_unique "
"ON numberRecord(u_s_msgnumber) "
"WHERE u_s_msgnumber IS NOT NULL;"
);
idx2.execute();
}
{
sqlite3pp::command idx3(
db,
"CREATE UNIQUE INDEX IF NOT EXISTS idx_bd_msgnumber_unique "
"ON numberRecord(bd_msgnumber) "
"WHERE bd_msgnumber IS NOT NULL;"
);
idx3.execute();
}
}
// ------------------------ 触发器每类仅保留最新N条-----------------------
void RecordQuery::ensureKeepTop20Triggers(sqlite3pp::database& db) {
// 对 callnumber 生效的触发器
{
QString qsql = QStringLiteral(
"CREATE TRIGGER IF NOT EXISTS trg_keep_callnumber "
"AFTER INSERT ON numberRecord "
"BEGIN "
" DELETE FROM numberRecord "
" WHERE callnumber IS NOT NULL "
" AND id NOT IN ("
" SELECT id FROM numberRecord "
" WHERE callnumber IS NOT NULL "
" ORDER BY id DESC LIMIT %1"
" );"
"END;"
).arg(LIMIT_NUMBER_COUNT);
QByteArray ba = qsql.toUtf8();
sqlite3pp::command cmd(db, ba.constData());
cmd.execute();
}
// 对 u_s_msgnumber 生效的触发器
{
QString qsql = QStringLiteral(
"CREATE TRIGGER IF NOT EXISTS trg_keep_us "
"AFTER INSERT ON numberRecord "
"BEGIN "
" DELETE FROM numberRecord "
" WHERE u_s_msgnumber IS NOT NULL "
" AND id NOT IN ("
" SELECT id FROM numberRecord "
" WHERE u_s_msgnumber IS NOT NULL "
" ORDER BY id DESC LIMIT %1"
" );"
"END;"
).arg(LIMIT_NUMBER_COUNT);
QByteArray ba = qsql.toUtf8();
sqlite3pp::command cmd(db, ba.constData());
cmd.execute();
}
// 对 bd_msgnumber 生效的触发器
{
QString qsql = QStringLiteral(
"CREATE TRIGGER IF NOT EXISTS trg_keep_bd "
"AFTER INSERT ON numberRecord "
"BEGIN "
" DELETE FROM numberRecord "
" WHERE bd_msgnumber IS NOT NULL "
" AND id NOT IN ("
" SELECT id FROM numberRecord "
" WHERE bd_msgnumber IS NOT NULL "
" ORDER BY id DESC LIMIT %1"
" );"
"END;"
).arg(LIMIT_NUMBER_COUNT);
QByteArray ba = qsql.toUtf8();
sqlite3pp::command cmd(db, ba.constData());
cmd.execute();
}
}
// ------------------------ 业务函数:保存 / 查询 / 清空 ------------------------
// 保存号码(若已存在则替换为最新一条),依赖唯一索引与触发器
bool RecordQuery::saveNumber(NumberKind kind, const QString& number) {
if (number.isEmpty()) return false;
const char* col = columnName(kind);
std::string sql = std::string("INSERT OR REPLACE INTO numberRecord (") + col + ") VALUES (?);";
sqlite3pp::command cmd(*m_db, sql.c_str());
// 转为 UTF-8并按 sqlite3pp 需要的重载传入
const QByteArray ba = number.toUtf8();
// 注意sqlite3pp 的 bind 索引从 1 开始,表示第一个参数
int rc = cmd.bind(1, ba.constData(), ba.size(), sqlite3pp::copy);
if (rc != SQLITE_OK) return false;
return cmd.execute() == SQLITE_OK;
}
// 查询某类号码按“新到旧”id DESC。触发器已保证最多20条
QStringList RecordQuery::queryNumbers(NumberKind kind, int limit) {
const char* col = columnName(kind);
std::string sql =
"SELECT " + std::string(col) +
" FROM numberRecord WHERE " + std::string(col) + " IS NOT NULL "
" ORDER BY id DESC LIMIT ?;";
sqlite3pp::query qry(*m_db, sql.c_str());
qry.bind(1, limit);
QStringList out;
for (auto v : qry) {
std::string val;
v.getter() >> val;
out << QString::fromStdString(val);
}
return out;
}
// 清空某一类号码(删除该列非空的记录)
bool RecordQuery::clearNumbers(NumberKind kind) {
const char* col = columnName(kind);
std::string sql = "DELETE FROM numberRecord WHERE " + std::string(col) + " IS NOT NULL;";
sqlite3pp::command cmd(*m_db, sql.c_str());
return cmd.execute() == SQLITE_OK;
}
// ------------------------ UI集成QComboBox 下拉列表 ------------------------
// - 第一项固定为“清空记录”
// - 其余为最近号码(新到旧)
// - 用户选择第一项 => 弹出确认框,确认后清空并刷新
void RecordQuery::refreshNumberCombo(QComboBox* combo, NumberKind kind) {
int limit = LIMIT_NUMBER_COUNT; //
const auto lst = queryNumbers(kind, limit);
combo->clear();
if(!lst.isEmpty())
{
combo->addItem(QStringLiteral("清空记录")); // 虚拟操作项
for (const auto& s : lst) combo->addItem(s);
combo->setCurrentIndex(1); // 不默认选中任何项
}
}
void RecordQuery::setupNumberCombo(QObject* owner, QComboBox* combo, NumberKind kind) {
refreshNumberCombo(combo, kind);
QObject::connect(combo, QOverload<int>::of(&QComboBox::activated), owner,
[combo, kind, this](int index) {
if (index == 0) {
auto ret = QMessageBox::question(
combo,
QStringLiteral("确认"),
QStringLiteral("是否清空该类号码记录?"),
QMessageBox::Yes | QMessageBox::No
);
if (ret == QMessageBox::Yes) {
if (!clearNumbers(kind)) {
QMessageBox::warning(combo, QStringLiteral("提示"), QStringLiteral("清空失败"));
}
refreshNumberCombo(combo, kind);
} else {
combo->setCurrentIndex(-1);
}
} else if (index > 0) {
// 选中某个号码(可把值写回到对应的 QLineEdit
const QString number = combo->itemText(index);
// 示例:
// if (auto lineEdit = combo->parent()->findChild<QLineEdit*>("yourLineEditObjectName")) {
// lineEdit->setText(number);
// }
}
}
);
}
void RecordQuery::InsertRecord(const Record& record) {
std::string sql = "INSERT INTO record(begin_time,channel,type,direction,number,call_duration,content) VALUES (?,?,?,?,?,?,?);";
sqlite3pp::command cmd(*m_db, sql.c_str());
@@ -49,8 +279,8 @@ void RecordQuery::InsertRecord(const Record& record) {
<< int(record.channel) << int(record.type) << int(record.direction)
<< record.number.toStdString() << int(record.callDuration) << record.content.toStdString();
cmd.execute();
}
void RecordQuery::InsertRecords(const std::vector<Record>& data){
for(const auto& r : data){
InsertRecord(r);

View File

@@ -5,6 +5,7 @@
#include <QDateTime>
#include <memory>
#include <vector>
#include <qcombobox.h>
#include "spdlog/spdlog.h"
#include "sqlite3pp.h"
@@ -46,6 +47,10 @@ struct DbRecord{
int callDuration;//s
};
// ------------------------ 基础工具与枚举 ------------------------
enum class NumberKind { Call, USMsg, BdMsg };
namespace Ui {
class RecordQuery;
@@ -61,6 +66,9 @@ public:
~RecordQuery();
void InsertRecord(const Record& data);
void InsertRecords(const std::vector<Record>& data);
bool saveNumber(NumberKind kind, const QString& number);
void refreshNumberCombo(QComboBox* combo, NumberKind kind);
void setupNumberCombo(QObject* owner, QComboBox* combo, NumberKind kind);
private slots:
void on_btnQuery_clicked();
@@ -92,6 +100,11 @@ private:
std::shared_ptr<spdlog::logger> m_logger;
void InitDatabase();
void ensureSchema(sqlite3pp::database& db);
void ensureKeepTop20Triggers(sqlite3pp::database& db);
QStringList queryNumbers(NumberKind kind, int limit);
bool clearNumbers(NumberKind kind);
void UpdateRecordList(const std::vector<DbRecord>& r);
QString getQueryCondition(bool isCountQuery = false);

View File

@@ -35,7 +35,7 @@ MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow) {
ui->setupUi(this);
setWindowTitle("卫星终端控制软件_V1.0.3");
setWindowTitle("卫星终端控制软件_V1.0.4");
//创建logger窗口
m_loggerWidget = std::make_shared<LoggerWidget>();//需要在RecordQuery创建前
@@ -124,6 +124,13 @@ MainWindow::MainWindow(QWidget *parent)
//test();
// QString s = "你是谁";
// m_logger->info(u8"{}---{}---{}",1,u8"水电费",s.toStdString());
ui->tabWidget->setCurrentIndex(0); //tab默认显示rdss tab
m_recordQueryWidget->setupNumberCombo(this, ui->cmbCallNumber, NumberKind::Call);
m_recordQueryWidget->setupNumberCombo(this, ui->cmbMessageNumberForUhfAndS, NumberKind::USMsg);
m_recordQueryWidget->setupNumberCombo(this, ui->cmbMessageNumberForBeiDou, NumberKind::BdMsg);
}
MainWindow::~MainWindow() { delete ui; }
@@ -425,8 +432,13 @@ void MainWindow::createBeiDouSignalStrengthChart() {
m_signalStrengthChart->addAxis(m_signalStrengthChartYAxis, Qt::AlignLeft);
// series->attachAxis(axisY);
// 减小图表边距 - 这是关键设置
m_signalStrengthChart->setMargins(QMargins(0, 0, 0, 0)); // 左上右下全部设为0
QChartView *chartView = new QChartView(m_signalStrengthChart, this);
chartView->setRenderHint(QPainter::Antialiasing);
chartView->setRenderHint(QPainter::Antialiasing);
// 设置ChartView的边距
chartView->setContentsMargins(0, 0, 0, 0);
ui->vboxChannelBeidouSignalStrength->addWidget(chartView);
m_stackedSeries = new QStackedBarSeries;
@@ -533,8 +545,13 @@ void MainWindow::createBeiDouRDSSSignalStrengthChart() {
m_RDS1signalStrengthChart->addAxis(m_RDS1signalStrengthChartYAxis, Qt::AlignLeft);
// series->attachAxis(axisY);
// 减小图表边距 - 这是关键设置
m_RDS1signalStrengthChart->setMargins(QMargins(0, 0, 0, 0)); // 左上右下全部设为0
QChartView *chartView = new QChartView(m_RDS1signalStrengthChart, this);
chartView->setRenderHint(QPainter::Antialiasing);
// 设置ChartView的边距
chartView->setContentsMargins(0, 0, 0, 0);
ui->vboxChannelBeidouRDS1SignalStrength->addWidget(chartView);
m_RDS2signalStrengthChart = new QChart;
@@ -551,8 +568,13 @@ void MainWindow::createBeiDouRDSSSignalStrengthChart() {
m_RDS2signalStrengthChart->addAxis(m_RDS2signalStrengthChartYAxis, Qt::AlignLeft);
// series->attachAxis(axisY);
// 减小图表边距 - 这是关键设置
m_RDS2signalStrengthChart->setMargins(QMargins(0, 0, 0, 0)); // 左上右下全部设为0
QChartView *chartView2 = new QChartView(m_RDS2signalStrengthChart, this);
chartView->setRenderHint(QPainter::Antialiasing);
// 设置ChartView的边距
chartView->setContentsMargins(0, 0, 0, 0);
ui->vboxChannelBeidouRDS2SignalStrength->addWidget(chartView2);
}
void MainWindow::setRDSSSignalStrengthValues(uint8_t type, const QStringList &categories,
@@ -644,18 +666,22 @@ void MainWindow::createAzimuthMapChart() {
const qreal radialMax = 90;
m_azimuthChart = new QPolarChart;
// m_azimuthChart->setTitle("");
//m_azimuthChart->setTitle("");
m_azimuthChart->legend()->setVisible(false);
// 减小图表边距 - 这是关键设置
m_azimuthChart->setMargins(QMargins(0, 0, 0, 0)); // 左上右下全部设为0
auto angularAxis = new QValueAxis;
angularAxis->setTickCount(9);
angularAxis->setLabelFormat("%.1f");
angularAxis->setLabelFormat("%d");
angularAxis->setShadesVisible(true);
angularAxis->setShadesBrush(QBrush(QColor(249, 249, 255)));
m_azimuthChart->addAxis(angularAxis, QPolarChart::PolarOrientationAngular);
auto radialAxis = new QValueAxis;
radialAxis->setTickCount(7);
radialAxis->setLabelFormat("%d");
m_azimuthChart->addAxis(radialAxis, QPolarChart::PolarOrientationRadial);
@@ -664,14 +690,26 @@ void MainWindow::createAzimuthMapChart() {
QChartView *chartView = new QChartView(m_azimuthChart, this);
chartView->setRenderHint(QPainter::Antialiasing);
// 设置ChartView的边距
chartView->setContentsMargins(0, 0, 0, 0);
ui->vboxAzimuthMap->addWidget(chartView);
}
void MainWindow::setAzimuthValues(const QList<QPointF> &points) {
m_azimuthChart->removeAllSeries();
auto series = new QScatterSeries;
series->setName("方位");
//series->setName("方位");
//series->setMarkerShape(QScatterSeries::MarkerShapeCircle); // 可选:圆形
series->setMarkerSize(10.0);
series->append(points);
m_azimuthChart->addSeries(series);
// 关联到已存在的极坐标轴
for (QAbstractAxis* ax : m_azimuthChart->axes(QPolarChart::PolarOrientationAngular))
series->attachAxis(ax);
for (QAbstractAxis* ax : m_azimuthChart->axes(QPolarChart::PolarOrientationRadial))
series->attachAxis(ax);
}
//--------------------------------------------------------------------------------------
// 消息列表操作
@@ -868,6 +906,11 @@ void MainWindow::on_btnCallAnswer_clicked() {
if(!r.first){
return;
}
if (m_recordQueryWidget->saveNumber(NumberKind::Call, number)) {
//QMessageBox::information(this, "提示", "保存成功");
// 触发器已保证只保留最新10条
m_recordQueryWidget->refreshNumberCombo(ui->cmbCallNumber, NumberKind::Call);
}
m_currentTalkingDirection = CommDirection::Send;
if(r.second == Channel::Uhf){
sendUdpMessage(pack_uhf_dial_cmd(number.toStdString()));
@@ -914,6 +957,11 @@ void MainWindow::on_btnSendMessageByUhfOrS_clicked() {
if(!r.first){
return;
}
if (m_recordQueryWidget->saveNumber(NumberKind::USMsg, number)) {
//QMessageBox::information(this, "提示", "保存成功");
// 触发器已保证只保留最新10条
m_recordQueryWidget->refreshNumberCombo(ui->cmbMessageNumberForUhfAndS, NumberKind::USMsg);
}
if(r.second == Channel::Uhf){
sendUdpMessage(pack_uhf_short_message_cmd(number.toStdString(),message.toStdU16String()));
}else if(r.second == Channel::S){
@@ -931,6 +979,11 @@ void MainWindow::on_btnSendMessageByBeiDou_clicked()
if(!checkMessage(message)){
return;
}
if (m_recordQueryWidget->saveNumber(NumberKind::BdMsg, number)) {
//QMessageBox::information(this, "提示", "保存成功");
// 触发器已保证只保留最新10条
m_recordQueryWidget->refreshNumberCombo(ui->cmbMessageNumberForBeiDou, NumberKind::BdMsg);
}
sendUdpMessage(pack_beidou_short_message_cmd(number.toStdString(),message.toStdU16String()));
}
@@ -1396,7 +1449,7 @@ void MainWindow::processSearchSatelliteStatusReport(const QByteArray& cmd){
status.number = cmd[data_index++];//卫星编号
status.locate_flag = cmd[data_index++];//卫星定位标志
status.snr = cmd[data_index++];//卫星信噪比
status.azimuth = qFromLittleEndian<quint16>(reinterpret_cast<const uchar*>(cmd.constData()+data_index));//卫星方位角
status.azimuth = qFromBigEndian<quint16>(reinterpret_cast<const uchar*>(cmd.constData()+data_index));//卫星方位角
data_index += 2;
status.pitch = cmd[data_index++];//卫星俯仰角
all_satellite_status.push_back(status);

View File

@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>1893</width>
<height>1142</height>
<width>1620</width>
<height>980</height>
</rect>
</property>
<property name="windowTitle">
@@ -24,6 +24,21 @@
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<property name="spacing">
<number>2</number>
</property>
<property name="leftMargin">
<number>1</number>
</property>
<property name="topMargin">
<number>1</number>
</property>
<property name="rightMargin">
<number>1</number>
</property>
<property name="bottomMargin">
<number>1</number>
</property>
<item>
<layout class="QVBoxLayout" name="verticalLayout_27" stretch="0,0,0">
<item>
@@ -400,7 +415,7 @@
<item>
<widget class="QTextEdit" name="txtCurrentItemMessageContent">
<property name="enabled">
<bool>false</bool>
<bool>true</bool>
</property>
<property name="maximumSize">
<size>
@@ -408,6 +423,9 @@
<height>80</height>
</size>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item>
@@ -461,6 +479,21 @@
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
<property name="spacing">
<number>2</number>
</property>
<property name="leftMargin">
<number>1</number>
</property>
<property name="topMargin">
<number>1</number>
</property>
<property name="rightMargin">
<number>1</number>
</property>
<property name="bottomMargin">
<number>1</number>
</property>
<item>
<widget class="QGroupBox" name="groupSatelliteStatus">
<property name="title">
@@ -941,30 +974,48 @@
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>0</number>
<number>1</number>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
<string>RDSS卫星</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_7">
<property name="spacing">
<number>2</number>
</property>
<property name="leftMargin">
<number>1</number>
</property>
<property name="topMargin">
<number>1</number>
</property>
<property name="rightMargin">
<number>1</number>
</property>
<property name="bottomMargin">
<number>1</number>
</property>
<item>
<widget class="QGroupBox" name="groupBox_53">
<property name="title">
<string>S1波束</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_71">
<property name="leftMargin">
<property name="spacing">
<number>2</number>
</property>
<property name="leftMargin">
<number>1</number>
</property>
<property name="topMargin">
<number>2</number>
<number>1</number>
</property>
<property name="rightMargin">
<number>2</number>
<number>1</number>
</property>
<property name="bottomMargin">
<number>2</number>
<number>1</number>
</property>
<item>
<layout class="QVBoxLayout" name="vboxChannelBeidouRDS1SignalStrength"/>
@@ -978,17 +1029,20 @@
<string>S2波束</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_72">
<property name="leftMargin">
<property name="spacing">
<number>2</number>
</property>
<property name="leftMargin">
<number>1</number>
</property>
<property name="topMargin">
<number>2</number>
<number>1</number>
</property>
<property name="rightMargin">
<number>2</number>
<number>1</number>
</property>
<property name="bottomMargin">
<number>2</number>
<number>1</number>
</property>
<item>
<layout class="QVBoxLayout" name="vboxChannelBeidouRDS2SignalStrength"/>
@@ -1002,24 +1056,42 @@
<attribute name="title">
<string>RNSS卫星</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_6">
<layout class="QVBoxLayout" name="verticalLayout_6" stretch="0,0">
<property name="spacing">
<number>2</number>
</property>
<property name="leftMargin">
<number>1</number>
</property>
<property name="topMargin">
<number>1</number>
</property>
<property name="rightMargin">
<number>1</number>
</property>
<property name="bottomMargin">
<number>1</number>
</property>
<item>
<widget class="QGroupBox" name="groupBox_52">
<property name="title">
<string>直方图</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_70">
<property name="leftMargin">
<property name="spacing">
<number>2</number>
</property>
<property name="leftMargin">
<number>1</number>
</property>
<property name="topMargin">
<number>2</number>
<number>1</number>
</property>
<property name="rightMargin">
<number>2</number>
<number>1</number>
</property>
<property name="bottomMargin">
<number>2</number>
<number>1</number>
</property>
<item>
<layout class="QVBoxLayout" name="vboxChannelBeidouSignalStrength"/>
@@ -1032,18 +1104,21 @@
<property name="title">
<string>分布图</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_68">
<property name="leftMargin">
<layout class="QHBoxLayout" name="horizontalLayout_68" stretch="0">
<property name="spacing">
<number>2</number>
</property>
<property name="leftMargin">
<number>1</number>
</property>
<property name="topMargin">
<number>2</number>
<number>1</number>
</property>
<property name="rightMargin">
<number>2</number>
<number>1</number>
</property>
<property name="bottomMargin">
<number>2</number>
<number>1</number>
</property>
<item>
<layout class="QVBoxLayout" name="vboxAzimuthMap"/>
@@ -1163,7 +1238,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>1893</width>
<width>1620</width>
<height>18</height>
</rect>
</property>