QT学习之路

article/2025/10/25 6:47:03

文章目录

      • 一、QT简单介绍
      • 二、.pro文件介绍
      • 三、 命名规范和常用快捷键以及QPushButton简单使用
      • 登录窗口布局
      • 控件--按钮组
      • 其他常用控件介绍
      • 自定义控件封装
      • Qt中的鼠标事件
      • 定时器一
      • 定时器二
      • event事件分发器
      • 事件过滤器
      • 绘图事件
      • 绘图高级设置
      • 绘图设备
      • QFile文件读写操作
      • QFileInfo文件信息读取

一、QT简单介绍

Qt是一个跨平台的C++图形用户界面应用程序框架。它为应用程序开发者提供建立艺术级图形界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组件编程。
== main.cpp==

#include "mywidget.h"
#include <QApplication> //包含头文件 应用程序// 程序入口 argc命令行变量数量  argv命令行变量数组
int main(int argc, char *argv[])
{//应用程序对象  a ,Qt中  有且仅有一个 应用程序对象QApplication a(argc, argv);//创建 MyWidget对象 w   MyWidget基类 QWidgetMyWidget w;//窗口默认是不会弹出的,如果想弹出 调用 show方法w.show();//a.exec()进入消息循环机制 pausereturn a.exec();}

在这里插入图片描述
运行时候出现Interrupt/Exception caught,解决办法为点击项目,在构建中选中清除系统环境变量。

二、.pro文件介绍

QT += core gui //包含的模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets //大于Qt4版本 才包含widget模块
TARGET = QtFirst //应用程序名 生成的.exe程序名称
TEMPLATE = app //模板类型 应用程序模板
SOURCES += main.cpp\ //源文件
mywidget.cpp
HEADERS += mywidget.h //头文件

.pro就是工程文件(project),它是qmake自动生成的用于生产makefile的配置文件。.pro文件的写法如下:
注释
从“#”开始,到这一行结束。
模板变量告诉qmake为这个应用程序生成哪种makefile。下面是可供使用的选择:TEMPLATE = app

app -建立一个应用程序的makefile。这是默认值,所以如果模板没有被指定,这个将被使用。
lib - 建立一个库的makefile。
vcapp - 建立一个应用程序的VisualStudio项目文件。
vclib - 建立一个库的VisualStudio项目文件。
subdirs -这是一个特殊的模板,它可以创建一个能够进入特定目录并且为一个项目文件生成makefile并且为它调用make的makefile。

指定生成的应用程序名

TARGET = QtDemo
工程中包含的头文件
HEADERS += include/painter.h
工程中包含的.ui设计文件
FORMS += forms/painter.ui
工程中包含的源文件
SOURCES += sources/main.cpp sources
工程中包含的资源文件
RESOURCES += qrc/painter.qrc
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
这条语句的含义是,如果QT_MAJOR_VERSION大于4(也就是当前使用的Qt5及更高版本)需要增加widgets模块。如果项目仅需支持Qt5,也可以直接添加“QT += widgets”一句。不过为了保持代码兼容,最好还是按照QtCreator生成的语句编写。
配置信息
CONFIG用来告诉qmake关于应用程序的配置信息。
CONFIG += c++11 //使用c++11的特性
在这里使用“+=”,是因为我们添加我们的配置选项到任何一个已经存在中。这样做比使用“=”那样替换已经指定的所有选项更安全。

三、 命名规范和常用快捷键以及QPushButton简单使用

mywidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H#include <QWidget>class MyWidget : public QWidget  //MyWidget继承QWidget
{Q_OBJECT  //Q_OBJECT宏 写了这个宏 就支持了 Qt中的信号和槽机制public:MyWidget(QWidget *parent = 0);  //构造函数~MyWidget(); //析构函数
};#endif // MYWIDGET_H

mywidget.cpp

#include "mywidget.h"
#include <QPushButton>
#include "mybutton.h"
#include <QDebug>
//命名规范 以及 快捷键
// 类名 首字母大写 单词与单词之间 首字母大写
// 函数、变量  首字母小写 单词与单词之间 首字母大写
// 快捷键
// 运行  ctrl + R
// 编译  ctrl + B
// 查找  ctrl + F
// 帮助文档 F1
// 字体缩放  ctrl + 鼠标滚轮
// 自动对齐  ctrl + i
// 整行移动 ctrl+ shift + ↑ 或者 ↓
// 同名之间的 .h .cpp切换  F4
// 帮助文档 第一种 : F1  第二种 :左侧按钮  第三种:C:\Qt\Qt5.6.0\5.6\mingw49_32\bin
// 注释快捷键  ctrl + /
MyWidget::MyWidget(QWidget *parent): QWidget(parent) //初始化列表
{//按钮QPushButton * btn = new QPushButton;//btn->show(); //show用顶层方式弹出,如果想在MyWidget窗口中显示,就需要依赖MyWidget窗口//设置父亲btn->setParent(this);//设置文字btn->setText("德玛西亚"); //将char* 隐式类型转为QString//创建按钮第二种方式  窗口会按照 btn2大小进行显示QPushButton * btn2 = new QPushButton("第二按钮",this);//重置窗口大小resize(600,400);//移动第二个按钮btn2->move(100,100);//按钮是否可以 重置大小resize? 可以btn2->resize(50,50);//重置窗口标题setWindowTitle("Qt第一个窗口");//设置固定窗口大小setFixedSize(600,400);//一定程度下 简化了内存回收机制//创建自己的按钮MyButton * myBtn = new MyButton;myBtn->setText("我的按钮");myBtn->move(200,200);myBtn->setParent(this);//Qt坐标系//x为右侧正向  y 以 下侧为正向//点击 myBtn 关闭窗口//参数1  信号的发送者  参数2  发送的信号(信号的地址) 参数3 信号的接受者 参数4 处理的槽函数(函数地址)//connect(myBtn,&MyButton::clicked , this , &MyWidget::close);connect(myBtn,&QPushButton::clicked , this , &QWidget::close);}MyWidget::~MyWidget()
{qDebug() << "MyWidget析构了!";
}

在这里插入图片描述
在这里插入图片描述
当基类打印的时候并没有析构,而是去寻找子类的析构,然后从子类开始析构。

登录窗口布局

1.Label
2.Line Edit
3.push button
4.通过widget来进行布局
5.Horizontal Spacer 水平弹簧中有个sizeType 将Expanding 变为Fixed

6.打破布局
7.栅格布局(几行几列可以用栅格布局)
8.垂直布局
9.选中QWidget 有个sizePolicy中有个垂直 策略,垂直策略中有个Fixed(将QWidget框变得跟控件一样大)
10.固定窗口大小,将minimumsize和maximumsize
11.QLineEdit 将echoMode修改为Password

控件–按钮组

1.在pushbutton输入的文字前面添加小图标,点qpushbutton,icon,选择资源,点iconSize.设置大小。
2.ToolButton 工具按钮 用于显示图片,如果想显示文字,修改风格:toolButtonStyle 选择ToolButton TextBesidecolor 凸起风格选中autoSize(透明)
3.Radio Button单选框 需要分组,Group Box.
4.多选框 checkBox.

其他常用控件介绍

scroll area 滚动区域
tool box 修改currentItemText为家人
tab widget 修改currentTabText为谷歌
stack widget需要结合其他空间使用,比如按钮。然后设置信号和槽。
combo box 下拉框
spin box 数字的加减
time edit data edit
horizontal scroll bar 水平滑动条
vertical scroll bar 垂直滑动条
vertical slider horizontal slider 配合spin box使用。需要自定义封装控件。
label不仅可以显示文字也可以显示图片

自定义控件封装

1自定义控件封装

1.1添加新文件 - Qt – 设计师界面类 (.h .cpp .ui)
1.2.ui中 设计 QSpinBox和QSlider 两个控件
1.3Widget中使用自定义控件,拖拽一个Widget,点击提升为,点击添加,点击提升
1.4实现功能,改变数字,滑动条跟着移动 ,信号槽监听。
1.5提供 getNum 和 setNum对外接口
1.6测试接口

Qt中的鼠标事件

在这里插入图片描述

在QLabel中可以找到这三个方法。
在这里插入图片描述

当按下鼠标左键或者右键的时候,再移动才会打印:鼠标移动了

在qmouseevent中可以找到鼠标坐标信息以及按键信息。global是基于屏幕的。

//鼠标按下
void mylabel::mousePressEvent(QMouseEvent *ev)
{//qDebug()<<"鼠标按下了";//当鼠标左键按下  提示信息if( ev->button() ==  Qt::LeftButton){QString str = QString( "鼠标按下了 x = %1   y = %2  globalX = %3 globalY = %4 " ).arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;}
}//鼠标释放
void mylabel::mouseReleaseEvent(QMouseEvent *ev)
{//qDebug()<<"鼠标释放了";if( ev->button() ==  Qt::LeftButton){QString str = QString( "鼠标释放了 x = %1   y = %2  globalX = %3 globalY = %4 " ).arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;}}//鼠标移动
void mylabel::mouseMoveEvent(QMouseEvent *ev)
{//qDebug()<<"鼠标移动了";if( ev->button()   ==  Qt::LeftButton ){QString str = QString( "鼠标移动了 x = %1   y = %2  globalX = %3 globalY = %4 " ).arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;}
}

在这里插入图片描述
上边这段代码,鼠标移动没有捕获

//鼠标按下
void mylabel::mousePressEvent(QMouseEvent *ev)
{//qDebug()<<"鼠标按下了";//当鼠标左键按下  提示信息if( ev->button() ==  Qt::LeftButton){QString str = QString( "鼠标按下了 x = %1   y = %2  globalX = %3 globalY = %4 " ).arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;}
}//鼠标释放
void mylabel::mouseReleaseEvent(QMouseEvent *ev)
{//qDebug()<<"鼠标释放了";if( ev->button() ==Qt::LeftButton){QString str = QString( "鼠标释放了 x = %1   y = %2  globalX = %3 globalY = %4 " ).arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;}}//鼠标移动
void mylabel::mouseMoveEvent(QMouseEvent *ev)
{//qDebug()<<"鼠标移动了";if( ev->buttons()& Qt::LeftButton ){QString str = QString( "鼠标移动了 x = %1   y = %2  globalX = %3 globalY = %4 " ).arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;}
}

在这里插入图片描述

//设置鼠标追踪后,鼠标进入区域就有移动信息打印出来。
mylabel::mylabel(QWidget *parent) : QLabel(parent)
{//设置鼠标追踪状态setMouseTracking(true);
}

在这里插入图片描述

2Qt中的事件
2.1鼠标事件
2.2鼠标进入事件 enterEvent
2.3鼠标离开事件 leaveEvent
2.4鼠标按下 mousePressEvent ( QMouseEvent ev)
2.5鼠标释放 mouseReleaseEvent
2.6鼠标移动 mouseMoveEvent
2.7ev->x() x坐标 ev->y() y坐标
2.8ev->button() 可以判断所有按键 Qt::LeftButton Qt::RightButton
2.9ev->buttons()判断组合按键 判断move时候的左右键 结合 & 操作符
2.10格式化字符串 QString( “ %1 %2 ” ).arg( 111 ).arg(222)
2.11设置鼠标追踪 setMouseTracking(true);

定时器一

在timerevent中选择QTimer Class|Qt Core 5.9
3定时器1
3.1利用事件 void timerEvent ( QTimerEvent * ev)
3.2启动定时器 startTimer( 1000) 毫秒单位
3.3timerEvent 的返回值是定时器的唯一标示 可以和ev->timerId 做比较

定时器二

4定时器2
4.1利用定时器类 QTimer
4.2创建定时器对象 QTimer * timer = new QTimer(this)
4.3启动定时器 timer->start(毫秒)
4.4每隔一定毫秒,发送信号 timeout ,进行监听
4.5暂停 timer->stop

event事件分发器

在这里插入图片描述

bool myLabel::event(QEvent *e)
{//如果是鼠标按下 ,在event事件分发中做拦截操作if(e->type() == QEvent::MouseButtonPress){QMouseEvent * ev  = static_cast<QMouseEvent *>(e);//QEvent是QMouseEvent的父类。QString str = QString( "Event函数中::鼠标按下了 x = %1   y = %2  globalX = %3 globalY = %4 " ).arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;return true; //true代表用户自己处理这个事件,不向下分发}//其他事件 交给父类处理  默认处理return QLabel::event(e);
}

5event事件
5.1用途:用于事件的分发
5.2也可以做拦截操作,不建议
5.3bool event( QEvent * e);
5.4返回值 如果是true 代表用户处理这个事件,不向下分发了
5.5e->type() == 鼠标按下 …

事件过滤器

 // 步骤2  重写 eventfilter事件
bool Widget::eventFilter(QObject * obj , QEvent * e)
{if(obj == ui->label){if(e->type() == QEvent::MouseButtonPress){QMouseEvent * ev  = static_cast<QMouseEvent *>(e);QString str = QString( "事件过滤器中::鼠标按下了 x = %1   y = %2  globalX = %3 globalY = %4 " ).arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());qDebug() << str;return true; //true代表用户自己处理这个事件,不向下分发}}//其他默认处理return QWidget::eventFilter(obj,e);
}

在这里插入图片描述
6事件过滤器
6.1在程序将时间分发到事件分发器前,可以利用过滤器做拦截
6.2步骤
6.2.11、给控件安装事件过滤器
6.2.22、重写 eventFilter函数 (obj , ev)

绘图事件

7QPainter 绘图
7.1绘图事件 void paintEvent() 可以不用显示调用这个函数
7.2声明一个画家对象 QPainter painter(this) this指定绘图设备
7.3画线、画圆、画矩形、画文字
7.4设置画笔 QPen 设置画笔宽度 、风格
7.5设置画刷 QBrush 设置画刷 风格

绘图高级设置

8QPainter高级设置
8.1抗锯齿 效率低
8.1.1painter.setRenderHint(QPainter::Antialiasing);
8.2对画家进行移动
8.2.1painter.translate(100,0);
8.2.2保存状态 save
8.2.3还原状态 restore
8.3如果想手动调用绘图事件 利用update
8.4利用画家画图片 painter.drawPixmap( x,y,QPixmap( 路飞) )

绘图设备

9QPaintDevice绘图设备
9.1QPixmap QImage QBitmap(黑白色) QPicture QWidget
9.2QPixmap 对不同平台做了显示的优化
9.2.1QPixmap pix( 300,300)
9.2.2pix.fill( 填充颜色 )
9.2.3利用画家 往pix上画画 QPainter painter( & pix)
9.2.4保存 pix.save( “路径”)
9.3Qimage 可以对像素进行访问
9.3.1使用和QPixmap差不多 QImage img(300,300,QImage::Format_RGB32);
9.3.2其他流程和QPixmap一样
9.3.3可以对像素进行修改 img.setPixel(i,j,value);
9.4QPicture 记录和重现 绘图指令
9.4.1QPicture pic
9.4.2painter.begin(&pic);
9.4.3保存 pic.save( 任意后缀名 )
9.4.4重现 利用画家可以重现painter.drawPicture(0,0,pic);

QFile文件读写操作

10QFile 对文件进行读写操作
10.1QFile进行读写操作
10.2QFile file( path 文件路径)
10.3读
10.3.1file.open(打开方式) QIODevice::readOnly
10.3.2全部读取 file.readAll() 按行读 file.readLine() atend()判断是否读到文件尾
10.3.3默认支持编码格式 utf-8
10.3.4利用编码格式类 指定格式 QTextCodeC
10.3.5QTextCodec * codec = QTextCodec::codecForName(“gbk”);
10.3.6//ui->textEdit->setText( codec->toUnicode(array) );
10.3.7文件对象关闭 close
10.4写
10.4.1file.open( QIODevice::writeOnly / Append)
10.4.2file.write(内容)
10.4.3file.close 关闭

QFileInfo文件信息读取

11QFileInfo 读取文件信息
11.1QFileInfo info(路径)
11.2qDebug() << “大小:” << info.size() << " 后缀名:" << info.suffix() << " 文件名称:"<<info.fileName() << " 文件路径:"<< info.filePath();
11.3 qDebug() << “创建日期:” << info.created().toString(“yyyy/MM/dd hh:mm:ss”);
11.4 qDebug() << “最后修改日期:”<<info.lastModified().toString(“yyyy-MM-dd hh:mm:ss”);
12


http://chatgpt.dhexx.cn/article/2Vjf5VSd.shtml

相关文章

在自己电脑上搭建一个FTP服务器

在自己电脑上搭建一个FTP服务器 因为项目需要&#xff0c;第一次搭建FTP&#xff0c;也是在博客上找的经验&#xff0c;写这篇博客&#xff0c;主要是想记录一下&#xff0c;留个笔记&#xff0c;以防后面需要。 本文是在不借助工具的情况下在自己电脑上搭建FTP服务器。我的是w…

搭建自己本地的IIS服务器

在工作中有时候不想买服务器&#xff0c;这个时候就需要将自己的电脑搭建成服务器。如何搭建呢&#xff1f;其实很简单&#xff0c;以下几步教你搞定。 1. 打开控制面板(window图标直接输入控制面板(control)), 找到程序->程序与功能->启用或关闭Windows功能。 2.找到“…

阿里云服务器如何搭建ip

很多客户的业务要求需要多个ip 来完成业务要求。大家认为的每个服务器只有一个公网ip&#xff0c;那么如何实现多个ip呢&#xff1f;怎样来部署呢&#xff1f; 根据自己需求选择服务器&#xff0c;选购的过程中需要注意的是&#xff1a;实例的网络类型必须是专有网络&#xff…

搭建MQTT服务器

搭建MQTT服务器 一、准备工作二、版本选择三、安装四、遇到的一些问题&#xff1a; 一、准备工作 1.查看&#xff08;Ubuntu&#xff09;系统版本&#xff1a; 使用命令&#xff1a;lsb_release -a 。 2、查看服务器的内核&#xff08;CPU架构&#xff09;&#xff1a; 我使…

域控服务器搭建

系统&#xff1a;windows server 2012 R2 一、 更改为固定IP 二、 修改计算机名称&#xff08;修改完成后重启&#xff09; 三、 打开服务器管理器&#xff0c;找到右上角【管理】-【添加角色和功能】 四、 这里直接点击下一步 五、 默认选择第一个&#xff0c;然后点击下一…

Nginx搭建服务器

第一步&#xff1a;下载安装包 Nginx下载地址 第二步&#xff1a;解压到合适的位置&#xff0c;修改配置 我这边是解压到D:\Program Files (x86)\nginx-1.21.6目录下&#xff0c;然后打开conf文件夹找到nginx.conf配置文件&#xff0c;用Notepad打开 修改下面几个配置即可搭…

搭建自己的服务器代理 yyds

一.购买需要搭建的服务器 为了方便自己搭建使用&#xff0c;直接来到阿里云购买轻量级服务器 点击跳转后&#xff0c;当前界面为服务器配置界面&#xff0c;对于第一次搭建建议购买24元/月的就可以&#xff0c;其次是区域必须为香港只有香港才可以连接到外网&#xff0c;镜像…

搭建文件服务器

文件服务器&#xff0c;又称档案伺务器&#xff0c;是指在计算机网络环境中&#xff0c;所有用户都可以访问的文件存储设备。 下面是搭建文件服务器的步骤&#xff1a; 1.打开Windows服务管理器<仪表盘&#xff0c;选择“添加角色和功能” 2.到这里选择文件服务器相应功能…

家庭宽带搭建服务器

家庭宽带搭建服务器 一、获得公网ip 如果是电信或者联通宽带可以打客服申请公网在线&#xff0c;绝大部分都能通过&#xff0c;理由可以说装监控或者玩游戏。移动宽带目前没用过就不讨论了。 **注意&#xff0c;这里的公网ip是动态公网ip&#xff0c;就是说会不定时更换。**…

搭建国外服务器

搭建国外服务器 学习内容&#xff1a; Namesoil 域名购买配置Cloudflare内容分发购买服务器掌握循环语句 Namesoil 域名购买 网站连接&#xff1a;https://www.namesilo.com/ 登录 搜索自己想要的网址名称 加入购物车 前往购买 支付完成后配置域名 查看域名 对域名进行DNS设…

虚拟手游服务器,自己搭建手机游戏服务器

自己搭建手机游戏服务器 内容精选 换一换 本文介绍了云手机CPH产品新特性和对应的文档动态,新特性将在各个区域(Region)陆续发布,欢迎体验。 部署游戏应用前,您需要准备硬件以及华为云的环境,主要包括以下内容:硬件环境:您需要准备一台带有显卡的Windows机器,硬盘至少20…

搭建自己的云服务器

搭建云服务器 本人学生一位&#xff0c;经常需要使用服务器进行软件测试&#xff0c;每次都需要搭建虚拟机很麻烦&#xff0c;所以找了一台云服务器&#xff0c;abeiyun云服务器 有了服务器后就可以搭建自己的云服务器了 安装系统 本人采用的是Ubuntu16.04版本的系统&#x…

Linux搭建服务器

文章目录 Linux搭建服务器1.基础环境配置1.1配置centos71.2安装xshall1.3安装xftp7 2.配置jdk 1.8第一步 卸载系统自带的OpenJDK以及相关的java文件第二步 下载最新稳定JDK第三步 解压JDK第四步 配置JDK环境变量第五步 让刚刚设置的环境变量生效并检查是否安装成功 3.配置tomca…

Git服务器搭建简明教程

1前言 本文详解在Ubantu 16下搭建Git服务器&#xff0c;力求让读者知其所以然&#xff0c;仅需安装Git和ssh&#xff0c;而无需其他软件。 2服务器搭建 在真实服务器或虚拟机里操作均可。另外&#xff0c;如果用VMware Workstation 16 Player的话&#xff0c;默认不用配置虚拟…

自己搭建微信小程序服务器,微信小程序搭建自己的Https服务器

一、注册微信小程序 进入微信公众平台,使用邮箱账号,选择注册小程序账号。一个邮箱只能注册一个类型的微信账号(订阅号、服务号、小程序)。 二、搭建Https服务器 1、域名注册 1.1、登录腾讯云平台,并注册账号。 1.2、选择“云产品”—”域名服务“—”域名管理" 1.3、选…

文件服务器搭建手机,自己搭建手机云服务器

自己搭建手机云服务器 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器。例如QQ.exe。在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器。例如QQ.exe。本地磁盘映射(推荐使用)使用远程桌面连接…

服务器搭建免流系统,国内服务器搭建免流

国内服务器搭建免流 内容精选 换一换 PHPWind(简称:PW)是一个基于PHP和MySQL的开源社区程序,是国内较受欢迎的论坛之一。轻架构,高效易开发,使用户可快速搭建并轻松管理。本文档指导用户使用华为云市场镜像“PHPWind 论坛社区系统(LAMP)”部署PHPWind论坛系统。弹性云服务器…

新手自己搭建服务器步骤

1.连接服务器 2. 修改实例的密码 3.配置安全组规则 4.安装finalShell远程终端工具执行以下代码 由于这是我们在此会话中与apt打包系统的第一次交互&#xff0c;因此我们将更新本地包索引&#xff0c;以便我们可以访问最新的包清单。 之后&#xff0c;我们可以安装nginx &…

如何搭建一台属于自己的服务器

对于新手小白来说&#xff0c;我推荐使用大厂们的服务器&#xff0c;比如阿里云&#xff0c;腾讯云等&#xff0c;这种不仅有强大的大厂背景支持&#xff0c;且不用担心维护&#xff0c;界面功能友好完善&#xff0c;非常适合新手小白 (๑•̀ㅂ•́)و✧ 我使用的是腾讯云&…

GIS开发:使用空间数据库

在早期GIS开发中&#xff0c;空间数据库的使用比较少&#xff0c;一般都是使用Arcgis Engine进行GIS空间分析等功能的开发&#xff0c;或者通过Spatial Database Engine&#xff08;sde&#xff09;空间数据引擎调用数据库的数据进行功能开发&#xff0c;开源方面&#xff0c;g…