Qt绘制动态罗盘

news2024/11/15 17:43:14

在这里插入图片描述
在这里插入图片描述

介绍:罗盘指针以30°角旋转巡逻,扫描航海范围内的点位,并绘制点云。字段信息在表格中显示,该数据都存储在数据库中。选择不同的范围,显示该范围内的点位。

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    initSystem();

    initQTableView();

    initQCheckBox();

    initDataBase();
}

MainWindow::~MainWindow()
{
    delete ui;

    m_myDatabase.close();
}

void MainWindow::initSystem()
{
    sourceDataList.clear();
    m_RefreshBtn    = new QPushButton("刷新",this);
    m_EscalationBtn = new QPushButton("上报",this);
    m_ResettingBtn  = new QPushButton("重置",this);

    m_model       = new QStandardItemModel(2,FixedColumnCount,this);
    m_selectModel = new QItemSelectionModel(m_model,this);

    ui->statusbar->addPermanentWidget(m_RefreshBtn);
    ui->statusbar->addPermanentWidget(m_EscalationBtn);
    ui->statusbar->addPermanentWidget(m_ResettingBtn);
    ui->statusbar->setSizeGripEnabled(false);//去掉状态栏右下角的三角


    ui->tableViewTarget->setModel(m_model);
    ui->tableViewTarget->setSelectionModel(m_selectModel);
    ui->tableViewTarget->setSelectionMode(QAbstractItemView::ExtendedSelection);
    ui->tableViewTarget->setSelectionBehavior(QAbstractItemView::SelectItems);
    ui->tableViewTarget->verticalHeader()->hide();
    ui->tableViewTarget->setEditTriggers(QAbstractItemView::NoEditTriggers);


    // 设置行表头自适应调整大小
    ui->tableViewTarget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
}

void MainWindow::initQTableView()
{
    QStringList headerList;
    headerList<<"批号"
              <<"目标方位"
              <<"目标距离"
              <<"目标属性"
              <<"目标种类"
              <<"目标航向";
    m_model->setHorizontalHeaderLabels(headerList);
}

void MainWindow::initQCheckBox()
{
    m_InTheAir       = new QCheckBox(INDEXAIRSTR);
    m_SurfaceOfWater = new QCheckBox(INDEXSURFACEWATER);
    m_underwater     = new QCheckBox(INDEXUNDEXWATER);
    m_Shore          = new QCheckBox(INDEXSHORE);

    //开启三态选择
    m_InTheAir->setTristate(true);
    m_SurfaceOfWater->setTristate(true);
    m_underwater->setTristate(true);
    m_Shore->setTristate(true);

    //设置初始状态
    m_InTheAir->setCheckState(Qt::Checked);
    m_SurfaceOfWater->setCheckState(Qt::Checked);
    m_underwater->setCheckState(Qt::Checked);
    m_Shore->setCheckState(Qt::Checked);

    QString styleSheet =
         "QCheckBox::indicator:indeterminate {"
         "border-image: url(:/checkbox_dark_normal.png);"  // 半选中状态的图片
         "}"
         "QCheckBox::indicator:unchecked {"
         "border-image: url(:/checkbox_dark_hover.png);"  // 未选中状态的图片
         "}"
         "QCheckBox::indicator:checked {"
         "    background-image: url(:/checkbox_dark_pressed.png);"  // 选中状态的图片
         "}"
         "QCheckBox::indicator {"
         "    width: 20px;"  // 设置复选框宽度
         "    height: 20px;"  // 设置复选框高度
         "}";

    // 设置样式表,使用本地图片作为背景
    m_InTheAir->setStyleSheet(styleSheet);
    m_SurfaceOfWater->setStyleSheet(styleSheet);
    m_underwater->setStyleSheet(styleSheet);
    m_Shore->setStyleSheet(styleSheet);

    QHBoxLayout *alayout = new QHBoxLayout;
    alayout->addWidget(m_InTheAir);
    alayout->addWidget(m_SurfaceOfWater);
    alayout->addWidget(m_underwater);
    alayout->addWidget(m_Shore);

    ui->widgetInsertCheckBox-> setLayout(alayout);

    connect(m_InTheAir,&QCheckBox:: stateChanged,this, &MainWindow::do_checkBoxAirSlot);
    connect(m_SurfaceOfWater,&QCheckBox:: stateChanged,this, &MainWindow::do_checkBoxSurfaceWaterSlot);
    connect(m_underwater,&QCheckBox:: stateChanged,this, &MainWindow::do_checkBoxUnderWaterSlot);
    connect(m_Shore,&QCheckBox:: stateChanged,this, &MainWindow::do_checkBoxShoreSlot);
}

void MainWindow::setQtableViewIndex(QString indexName, int &state)
{
   if(state == Qt::Checked){//选中
          int rowTotal = sourceDataList.size();
          for (int row = 0; row < rowTotal ; row++) {
              QString aLineText = sourceDataList.at(row);//获取一行数据
              QStringList tempList = aLineText.split(" ");//把一行数据,用空格隔开
              if(aLineText.contains(indexName) == true){
                   m_model->insertRow(m_model->rowCount(), QList<QStandardItem*>()
                                             << new QStandardItem(tempList.at(0))
                                             << new QStandardItem(tempList.at(1))
                                             << new QStandardItem(tempList.at(2))
                                             << new QStandardItem(tempList.at(3))
                                             << new QStandardItem(tempList.at(4))
                                             << new QStandardItem(tempList.at(5)));
              }

          }

          //创建排序和过滤代理
          QSortFilterProxyModel*   proxyModel = new QSortFilterProxyModel(this);
          // 创建过滤器
          proxyModel->setSourceModel(m_model);
          proxyModel->setFilterKeyColumn(0);

          proxyModel->sort(0, Qt::AscendingOrder);
          // 设置表格视图的模型为过滤器
          ui->tableViewTarget->setModel(proxyModel);

   }else if(state == Qt::Unchecked){//未选择
       // 删除满足条件的行
       for (int row = 0; row < m_model->rowCount(); ++row) {
           if (m_model->item(row, 4)->text() == indexName) {
               m_model->removeRow(row);
               // 因为删除了一行,所以需要重新检查当前行
               --row;
           }
       }
   }else if(state == Qt::PartiallyChecked){//半选中
       //no deal with
   }
   undatePointClouds();
}

void MainWindow::do_checkBoxAirSlot(int state)
{
    setQtableViewIndex(INDEXAIRSTR,state);
}

void MainWindow::do_checkBoxSurfaceWaterSlot(int state)
{
    setQtableViewIndex(INDEXSURFACEWATER,state);
}

void MainWindow::do_checkBoxUnderWaterSlot(int state)
{
    setQtableViewIndex(INDEXUNDEXWATER,state);
}

void MainWindow::do_checkBoxShoreSlot(int state)
{
    setQtableViewIndex(INDEXSHORE,state);
}


void MainWindow::initDataBase()
{
    //安装驱动
    m_myDatabase = QSqlDatabase::addDatabase("QSQLITE");

    //给数据库取名字
    m_myDatabase.setDatabaseName("situation.db");

    //打开数据库
    if(!m_myDatabase.open())
    {
        qDebug() << "Error to open database" << m_myDatabase.lastError();
        return;
    }

    createDataBase();
}

//创建数据库
void MainWindow::createDataBase()
{
    QSqlQuery query;

    if(!query.exec("create table if not exists situation(batchNumber int, targetBeare double ,"
                   "targetDistance double, targetProperties text, targetType text, targetCourse int);"))
    {
        qDebug() << "Create Table is error" << m_myDatabase.lastError();
        return;
    }
    serchDataBase();
}

//插入数据库数据  【如果后期需要插入数据,可以调用此接口】
void MainWindow::insertDataBase(int &batchNum,double &targetBear,double &targetDist,QString &targetPro,QString &targetType,int & targetCourse)
{
    QSqlQuery query = QSqlQuery(m_myDatabase);
     QString cmd = QString("insert into situation values(\"%1\",\"%2\",\"%3\",\"%4\",\"%5\",\"%6\");")
             .arg(batchNum).arg(targetBear).arg(targetDist).arg(targetPro).arg(targetType).arg(targetCourse);
     if(!query.exec(cmd))
     {
         qDebug() << "Error to Insert Into Database " << m_myDatabase.lastError();
         return;
     }
}

void MainWindow::undatePointClouds()
{
    m_X.clear();
    m_Y.clear();

    for (int row = 0; row < m_model->rowCount(); ++row) {
        QModelIndex index1 = m_model->index(row, 1, QModelIndex()); // 第2列
        QModelIndex index2 = m_model->index(row, 2, QModelIndex()); // 第3列
        QVariant data1 = m_model->data(index1, Qt::DisplayRole);
        QVariant data2 = m_model->data(index2, Qt::DisplayRole);
        m_X.push_back(data1.toDouble());
        m_Y.push_back(data2.toDouble());
    }
    ui->widget->initQCustomPlot(ui->widget,m_X,m_Y);
}

//查询数据库成员
void MainWindow::serchDataBase()
{
    QSqlQuery query = QSqlQuery(m_myDatabase);
    QString cmd = QString("select * from situation");//查询数据库
    if(!query.exec(cmd))//判断数据库是否为空
    {
       qDebug() << "Error Select to Database" << m_myDatabase.lastError();
       return;
    }

    QSqlRecord record = query.record();//获取当前记录

    QStandardItem *aItem;
    int i = 0;
      //在表格中显示信息
    while (query.next()){
        QString aLine = "";
        aLine.clear();
        for (int j = 0; j < record.count(); ++j) {
             aItem = new QStandardItem(query.value(j).toString());
             m_model->setItem(i,j,aItem);

             aLine.append(query.value(j).toString());
             aLine.append(" ");
        }
        sourceDataList.append(aLine);
        i++;
    }
    undatePointClouds();
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1491101.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自建Redis蜜罐以捕获和分析潜在攻击

一、引言 随着网络攻击的日益频繁和复杂&#xff0c;传统的防御措施往往难以应对。蜜罐作为一种主动防御技术&#xff0c;通过模拟有价值的服务来吸引攻击者&#xff0c;从而收集和分析攻击数据&#xff0c;提高网络安全性。本文将介绍如何自建一个Redis蜜罐&#xff0c;以捕获…

会员管理系统怎么更加有效触达会员?

如何更有效地触达会员&#xff0c;提高他们的满意度和忠诚度&#xff0c;是许多企业面临的挑战。以下是博阳会员管理系统建议的一些可以帮助企业更有效触达会员的方法。 首先&#xff0c;精准定位是触达会员的关键 企业需要深入了解他们的会员是谁&#xff0c;他们的需求是什么…

学习javascript,前端知识精讲,助力你轻松掌握

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;前端泛海 景天的主页&#xff1a;景天科技苑 文章目录 1.JavaScript 简介2.js中,一切皆是对象3.js的引入方式4.js的变量以及…

3Dmax最全快捷键大全,赶紧收藏起来练习起来吧

3Dmax做为一款专业的建模软件&#xff0c;有很多快捷键能帮助我们更好地学习&#xff0c;提升自己的能力。 废话不多说&#xff0c;我们一起来看看。 以上就是3dmax最全快捷键大全&#xff0c;看着容易&#xff0c;但是想要掌握好还需要我们多多练习。 本地max跑图太慢的朋友可…

python水表识别图像识别深度学习 CNN

python水表识别&#xff0c;图像识别深度学习 CNN&#xff0c;Opencv,Keras 重点&#xff1a;项目和文档是本人近期原创所作&#xff01;程序可以将水表图片里面的数据进行深度学习&#xff0c;提取相关信息训练&#xff0c;lw1.3万字重复15%&#xff0c;可以直接上交那种&…

打通易快报与金蝶K3Wise,实现采购流程高效协同!

一、客户介绍 某三维科技有限公司&#xff0c;作为业内知名的科技创新型企业&#xff0c;专注于高端三维科技产品的研发、生产与销售。随着企业规模的扩大和业务的不断增长&#xff0c;公司对于采购流程的高效管理和协同需求日益凸显。为了实现采购流程的自动化和智能化&#…

自动驾驶轨迹规划之碰撞检测(四)

欢迎大家关注我的B站&#xff1a; 偷吃薯片的Zheng同学的个人空间-偷吃薯片的Zheng同学个人主页-哔哩哔哩视频 (bilibili.com) 目录 1.基于圆覆盖 2.BVH 自动驾驶轨迹规划之碰撞检测&#xff08;一&#xff09;-CSDN博客 自动驾驶轨迹规划之碰撞检测&#xff08;二&#x…

MySQL——性能调优

性能调优&#xff08;重要&#xff09; SQL 优化的目的 减少磁盘 IO&#xff1a;尽可能避免全表扫描、尽量使用索引、尽量使用覆盖索引减少回表操作减少 CPU 和内存的消耗&#xff0c;尽可能减少排序、分组、去重之类的操作&#xff0c;尽量减少事务持有锁的时间 优化途径&…

在三个el-form-item中的el-radio的值中取一个发送给后端怎么获取

问: 请问,这段代码怎么获取:无策略,策略1,策略2的值? 回答: 问: 三个里面只可以选中一个吗? 回答:

SpringCloud-数据认证加密总结

一、数据加密认证介绍 在当今分布式系统的日益复杂和信息传递的广泛网络化环境中&#xff0c;确保通信的安全性至关重要。数据的加密和认证作为保障信息传递安全的关键手段&#xff0c;在分布式系统中扮演着不可或缺的角色。Spring Cloud&#xff0c;作为一套构建微服务架构的…

【LeetCode每日一题】1976. 到达目的地的方案数

文章目录 [1976. 到达目的地的方案数](https://leetcode.cn/problems/number-of-ways-to-arrive-at-destination/)思路&#xff1a;代码&#xff1a; 1976. 到达目的地的方案数 思路&#xff1a; 利用 Dijkstra 算法计算最短路径&#xff0c;并同时记录最短路径的数量&#xf…

双指针的一些题目

题目1&#xff1a;统计子矩阵 4405. 统计子矩阵 - AcWing题库 解题 前缀和暴力枚举x1、y1、x2、y2的做法是O()的&#xff0c;考虑用双指针进行优化。 优化的方式是&#xff1a;我们将每一列在[x1,x2]范围内的部分看作一个整体&#xff0c;用指针维护左右边界。 当当前矩阵的…

直播预告|从一张 CD 说起,关于播放器的前世今生

1877 年&#xff0c;天才发明家爱迪生研发出了人类历史上第一台可以录音和放音的装置&#xff0c;被称为“话筒”。 当时&#xff0c;这台机器使用一张薄薄的铁箔盘来录制声音&#xff0c;爱迪生亲手转动铁箔盘&#xff0c;在上面刻下声音的波纹。不过这个设计并不太实用&…

python中的defaultdict

collections.defaultdict 是 collections 模块提供的一个有用的类&#xff0c;它是内置字典类 dict 的一个子类。与普通字典一样&#xff0c;可以进行元素的访问、添加、删除等操作。区别在于当访问一个不存在的键时&#xff0c;defaultdict 会返回默认值&#xff0c;而不会引发…

ArcGIS学习(十二)ModelBuilder参数化建模

ArcGIS学习(十二)ModelBuilder参数化建模 1.ModelBuilder应用基础 本任务给大家带来的是ArcGIS中一个非常有意思也很重要的模块一-ModelBuilder。ModelBuilder有什么用呢? 大家设想一下这些场景: 你在做一项复杂研究,使用到ArcGIS中的多个工具和步骤,包括缓冲区分析、空…

建立网络防御时需要重点考虑的10个因素

互联网安全中心&#xff08;CIS&#xff09;建议企业可以从以下10个因素入手&#xff1a;资产管理、数据管理、安全配置、账户和访问控制管理、漏洞管理、日志管理、恶意软件防御、数据恢复、安全培训和事件响应。 1、资产管理 建立网络防御的第一步是制定企业资产和软件资产的…

居间中介CRM系统:提升销售业绩,有效管理企业客户资源

居间中介CRM系统是一种用于提升销售业绩和有效管理企业客户资源的软件系统。它能够帮助居间中介机构跟踪和管理客户关系&#xff0c;提高销售团队的工作效率和组织能力。 鑫鹿居间中介CRM系统具备以下功能&#xff1a; 1. 客户管理 系统可以记录和维护客户的基本信息&#xf…

Nano 33 BLE Sense Rev2学习第一节——环境配置

参考文档见Access Barometric Pressure Sensor Data on Nano 33 BLE Sense | Arduino Documentation 打开Arduino ide安装开发板 选择开发板 连接开发板到电脑&#xff0c;自动识别开发板端口&#xff0c;选择端口

小华最多能得到多少克黄金 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 小华按照地图去寻宝&#xff0c;地图上被划分成 m 行和 n 列的方格横纵坐标范围分别是[ 0 ,n−1]和[ 0 , m−1]。 在横坐标和纵坐标数位之和不大于 k 的方格中存…

了解现货黄金的技术分析技巧

在金融市场&#xff0c;特别是现货黄金交易领域中&#xff0c;投资者和交易者都致力于寻找那些可以带来盈利的秘诀与策略。黄金作为一种避险资产&#xff0c;其价格受到众多因素的影响&#xff0c;包括全球经济状况、货币政策、市场需求等。因此&#xff0c;掌握现货黄金的技术…