当前位置: 首页 > news >正文

qt连接tcp通信和连接数据库

通过数据库实现学生管理系统

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//判断数据库对象是否包含了自己使用的数据库  Studemt.dbif(!db.contains("Student.db")){//添加一个数据库db = QSqlDatabase::addDatabase("QSQLITE");                   //表示使用的是sqlite3版本的数据库//给数据库命名db.setDatabaseName("Student.db");}//打开数据库if(!db.open()){QMessageBox::information(this,"提示","数据库打开失败");return;}//此时说明数据库创建完毕并打开//就可以创建数据表了//需要使用SQL语句,需要使用QSQLQuerry类对象完成//准备SQL语句QString sql = "create table if not exists myTable("              //创建表的sql语句"id integer primary key autoincrement,"          //id主键,允许自增"numb integer,"                                  //学号,是整形"name varchar(10),"                              //姓名   字符串"score integer,""sex varchar(4))";                                //性别 字符串//定义语句执行者QSqlQuery querry;//使用queery执行SQL语句if(!querry.exec(sql)){QMessageBox::information(this,"失败","创建表失败");}else{QMessageBox::information(this,"成功","创建表成功");}
}Widget::~Widget()
{delete ui;
}//录入按钮对应的槽函数
void Widget::on_btn1_clicked()
{//获取ui界面中要存入数据库中的数据int numb_ui = ui->edit1->text().toInt();            //获取学号QString name_ui = ui->edit2->text();                //获取姓名int score_ui = ui->edit3->text().toInt();           //获取分数QString sex_ui = ui->edit4->text();                 //获取性别if(numb_ui == 0 || name_ui.isEmpty() || score_ui == 0||sex_ui.isEmpty()){QMessageBox::information(this,"提示","请将信息填充完整");return ;}//准备SQL语句QString sql = QString("insert into myTable(numb,name,score,sex)""values(%1,'%2',%3,'%4')").arg(numb_ui).arg(name_ui).arg(score_ui).arg(sex_ui);//定义语句执行官QSqlQuery querry;//调用执行者的相关函数执行SQL语句if(!querry.exec(sql)){QMessageBox::information(this,"失败","插入失败");}else{QMessageBox::information(this,"成功","插入成功");}
}//展示按钮对应的槽函数
void Widget::on_btn2_clicked()
{//准备SQL语句QString sql = "select * from myTable";//准备语句执行者QSqlQuery querry;if(!querry.exec(sql)){QMessageBox::information(this,"失败","查找失败");return;}//此时将查找的所有结果全都都放在querry对象中//可以通过next函数不断遍历查询结果int i = 0;                           //记录行号while(querry.next()){//遍历任意一组记录,querry.record//querry.record();//要找到每条一条记录 中的每个数据使用//qDebug() << querry.record().value(2);//返回当前记录对应数据项的个数//querry.record().count();//将记录的某一项的数据转变成了字符串//querry.record().value(2).toString();//将数据库中的表格展示到ui界面//ui->tableWidget->setItem();for(int j = 0; j<querry.record().count()-1; j++){ui->tableWidget->setItem(i,j,new QTableWidgetItem(querry.record().value(j+1).toString()));}i++;                             //进行下一行}
}//查找按钮
void Widget::on_btn3_clicked()
{//获取ui界面中要存入数据库中的数据int numb_ui = ui->edit1->text().toInt();            //获取学号QString name_ui = ui->edit2->text();                //获取姓名int score_ui = ui->edit3->text().toInt();           //获取分数QString sex_ui = ui->edit4->text();                 //获取性别if(numb_ui != 0){ui->tableWidget->clear();//准备SQL语句QString sql = QString("select * from myTable where %1 == numb").arg(numb_ui);//准备语句执行者QSqlQuery querry;if(!querry.exec(sql)){QMessageBox::information(this,"失败","查找失败");return;}int i = 0;                           //记录行号while(querry.next()){for(int j = 0; j<querry.record().count()-1; j++){ui->tableWidget->setItem(i,j,new QTableWidgetItem(querry.record().value(j+1).toString()));}i++;                             //进行下一行}}else if(!name_ui.isEmpty()){ui->tableWidget->clear();//准备SQL语句QString sql = QString("select * from myTable where '%2' == name").arg(name_ui);//准备语句执行者QSqlQuery querry;if(!querry.exec(sql)){QMessageBox::information(this,"失败","查找失败");return;}int i = 0;                           //记录行号while(querry.next()){for(int j = 0; j<querry.record().count()-1; j++){ui->tableWidget->setItem(i,j,new QTableWidgetItem(querry.record().value(j+1).toString()));}i++;                             //进行下一行}}else if(score_ui != 0){ui->tableWidget->clear();//准备SQL语句QString sql = QString("select * from myTable where %3 == score").arg(score_ui);//准备语句执行者QSqlQuery querry;if(!querry.exec(sql)){QMessageBox::information(this,"失败","查找失败");return;}int i = 0;                           //记录行号while(querry.next()){for(int j = 0; j<querry.record().count()-1; j++){ui->tableWidget->setItem(i,j,new QTableWidgetItem(querry.record().value(j+1).toString()));}i++;                             //进行下一行}}else if(!sex_ui.isEmpty()){ui->tableWidget->clear();//准备SQL语句QString sql = QString("select * from myTable where '%4' == sex").arg(sex_ui);//准备语句执行者QSqlQuery querry;if(!querry.exec(sql)){QMessageBox::information(this,"失败","查找失败");return;}int i = 0;                           //记录行号while(querry.next()){for(int j = 0; j<querry.record().count()-1; j++){ui->tableWidget->setItem(i,j,new QTableWidgetItem(querry.record().value(j+1).toString()));}i++;                             //进行下一行}}
}//删除按钮
void Widget::on_btn4_clicked()
{//获取ui界面中要存入数据库中的数据int numb_ui = ui->edit1->text().toInt();            //获取学号QString name_ui = ui->edit2->text();                //获取姓名int score_ui = ui->edit3->text().toInt();           //获取分数QString sex_ui = ui->edit4->text();                 //获取性别if(numb_ui != 0 ){ui->tableWidget->clear();//准备SQL语句QString sql = QString("delete from myTable where %1 == numb").arg(numb_ui);//准备语句执行者QSqlQuery querry;if(!querry.exec(sql)){QMessageBox::information(this,"失败","删除失败");return;}else{QMessageBox::information(this,"成功","删除成功");}//准备SQL语句QString sql1 = "select * from myTable";querry.exec(sql1);int i = 0;                           //记录行号while(querry.next()){for(int j = 0; j<querry.record().count()-1; j++){ui->tableWidget->setItem(i,j,new QTableWidgetItem(querry.record().value(j+1).toString()));}i++;                             //进行下一行}}else if(!name_ui.isEmpty()){ui->tableWidget->clear();//准备SQL语句QString sql = QString("delete from myTable where '%2' == name").arg(name_ui);//准备语句执行者QSqlQuery querry;if(!querry.exec(sql)){QMessageBox::information(this,"失败","删除失败");return;}else{QMessageBox::information(this,"成功","删除成功");}int i = 0;                           //记录行号while(querry.next()){for(int j = 0; j<querry.record().count()-1; j++){ui->tableWidget->setItem(i,j,new QTableWidgetItem(querry.record().value(j+1).toString()));}i++;                             //进行下一行}}else if(score_ui != 0){ui->tableWidget->clear();//准备SQL语句QString sql = QString("delete from myTable where %3 == score").arg(score_ui);//准备语句执行者QSqlQuery querry;if(!querry.exec(sql)){QMessageBox::information(this,"失败","删除失败");return;}else{QMessageBox::information(this,"成功","删除成功");}int i = 0;                           //记录行号while(querry.next()){for(int j = 0; j<querry.record().count()-1; j++){ui->tableWidget->setItem(i,j,new QTableWidgetItem(querry.record().value(j+1).toString()));}i++;                             //进行下一行}}else if(!sex_ui.isEmpty()){ui->tableWidget->clear();//准备SQL语句QString sql = QString("delete from myTable where '%4' == sex").arg(sex_ui);//准备语句执行者QSqlQuery querry;if(!querry.exec(sql)){QMessageBox::information(this,"失败","删除失败");return;}else{QMessageBox::information(this,"成功","删除成功");}int i = 0;                           //记录行号while(querry.next()){for(int j = 0; j<querry.record().count()-1; j++){ui->tableWidget->setItem(i,j,new QTableWidgetItem(querry.record().value(j+1).toString()));}i++;                             //进行下一行}}}

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QSqlDatabase>                         //数据库管理类
#include<QSqlQuery>                            //执行SQL语句对应的类
#include<QSqlRecord>                           //记录类
#include<QMessageBox>
#include<QDebug>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_btn1_clicked();void on_btn2_clicked();void on_btn3_clicked();void on_btn4_clicked();private:Ui::Widget *ui;//定义一个数据库对象QSqlDatabase db;
};
#endif // WIDGET_H

 

 tcp服务器

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//给服务器指针实例化对象server = new QTcpServer(this);
}Widget::~Widget()
{delete ui;
}//启动服务器按钮对应的槽函数
void Widget::on_btn_clicked()
{//获取ui界面上的端口号quint16 port = ui->edit->text().toUInt();if(!server->listen(QHostAddress::Any,port)){QMessageBox::critical(this,"失败","服务器启动失败");return;}else{QMessageBox::information(this,"成功","服务器启动成功");}connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);
}//处理的newConnection信号的槽函数的实现
void Widget::newConnection_slot()
{qDebug() << "有新的客户端发来连接请求";QTcpSocket *s = server->nextPendingConnection();//将获取的套接字存放到客户端容器中clientList.push_back(s);connect(s,&QTcpSocket::readyRead,this,&Widget::redyRead_slot);
}//关于readyRead信号的槽函数
void Widget::redyRead_slot()
{//删除客户端链表中的无效客户端套接字for(int i=0;i<clientList.count();i++){if(clientList[i]->state() == 0){clientList.removeAt(i);               // 将下标为i的客户端移除掉}}//遍历所有客户端,查看是哪个客户端发来数据for(int i=0;i<clientList.count();i++){if(clientList[i]->bytesAvailable() != 0){QByteArray msg = clientList[i]->readAll();//将数据展示到ui界面上ui->msglist->addItem(QString::fromLocal8Bit(msg));//接接受的消息发送到所有客户端,发送给所有客户端for(int j=0;j<clientList.count();j++){clientList[j]->write(msg);}}}
}

tcp客户端

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//客户端指针实例化空间socket = new QTcpSocket(this);connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);connect(socket,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);
}Widget::~Widget()
{delete ui;
}//连接服务器按钮对应的槽函数
void Widget::on_btn2_clicked()
{//获取ui界面的信息userName = ui->edit2->text();                       //获取用户名QString hostName = ui->edit3->text();               //获取主机地址quint16 port= ui->edit4->text().toUInt();           //获取端口号socket->connectToHost(hostName,port);}void Widget::connected_slot()
{QMessageBox::information(this,"成功","连接服务器成功");//顺便向服务器发送一条信息QString msg = userName + ":进入聊天室";socket->write(msg.toLocal8Bit());
}//关于readyRead信号的槽函数
void Widget::readyRead_slot()
{//读取该客户端中的数据QByteArray msg = socket->readAll();//将数据展示在ui界面ui->listWidget->addItem(QString::fromLocal8Bit(msg));
}//发送消息
void Widget::on_btn1_clicked()
{//获取ui界面中编辑文本的内容QString m = ui->edit1->text();//整合要发送的信息QString msg = userName + ":" + m;//将消息发送给服务器socket->write(msg.toLocal8Bit());//将消息编辑框中的内容清空ui->edit1->clear();
}//断开服务器
void Widget::on_btn3_clicked()
{//准备要发送的信息QString msg = userName + ":离开聊天室";socket->write(msg.toLocal8Bit());socket->disconnectFromHost();}void Widget::disconnected_slot()
{QMessageBox::information(this,"退出","退出成功");
}

相关文章:

qt连接tcp通信和连接数据库

通过数据库实现学生管理系统 widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//判断数据库对象是否包含了自己使用的数据库 Studemt.dbif(!db.co…...

MySQL Oracle区别

由于SQL Server不常用&#xff0c;所以这里只针对MySQL数据库和Oracle数据库的区别 (1) 对事务的提交 MySQL默认是自动提交&#xff0c;而Oracle默认不自动提交&#xff0c;需要用户手动提交&#xff0c;需要在写commit;指令或者点击commit按钮 (2) 分页查询 MySQL是直接在SQL语…...

Figma实用插件速收藏!精选19个干货插件大公开!

Figma 如今有着大量的插件&#xff0c;在 UI/UX 设计领域&#xff0c;很多工作已经不用真的从零开始做了。用好 Figma 插件&#xff0c;往往能让设计工作事半功倍。不过其中的插件素质差别很大&#xff0c;需要仔细筛选。不过如果你选择了对的插件&#xff0c;合理的设置&#…...

【STM32】FSMC—扩展外部 SRAM 初步使用 1

基于野火指南者《零死角玩转 STM32F103—指南者》的学习 STM32F103系列 FSMC Flexible Static Memory Controller简介 1.详细功能参看《STM32F10x参考手册》&#xff0c;这边是概述 是一个外设&#xff0c;挂载在AHB总线下。 可以用于驱动包括 SRAM、NOR FLASH 以及 NAND FL…...

保姆级教程 --redis启动命令

1、在redis目录 打开命令 windowr 输入cmd 2、输入 redis-server.exe redis.windows.conf 启动redis命令&#xff0c;看是否成功 3、可能会启动失败&#xff0c;报28 Nov 09:30:50.919 # Creating Server TCP listening socket 127.0.0.1:6379: bind: No error 4、报错后&am…...

【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用 )

文章目录 一、构造函数分类1、构造函数分类简介2、构造函数分类代码分析无参构造函数有参构造函数拷贝构造函数 二、代码示例 - 三种类型构造函数定义与调用 一、构造函数分类 1、构造函数分类简介 C 构造函数可以分为以下几类 : 无参构造函数 : 最简单也是默认的构造函数 , 函…...

胡焕庸线,我国东西地级市分布密度分界线

背景 黑河—腾冲线&#xff0c;又名胡焕庸线&#xff0c;是我国人口密度分布的东西近似分界线。今天把地级市坐标分布密度做成热力图&#xff0c;并与胡焕庸线一起展示时&#xff0c;惊奇的发现&#xff0c;胡焕庸线貌似也是我车东西地级市分布密度的分界线。 生成folium地图…...

里氏替换原则在继承关系中子类对父类方法的重写(覆盖)或重载时应遵循的规则

什么是里氏替换原则&#xff1a;只要父类能出现的地方子类就可以出现&#xff0c;而且 替换为子类也不会产生任何错误或异常&#xff0c;使用者可能根本就不需要知道是父类还是子类。但是&#xff0c;反过来就不行了&#xff0c;有子类出现的地方&#xff0c;父类未必就能适应。…...

【脑机接口开源数据处理包】brainflowBrainFlow是一个库,旨在获取,解析和分析脑电图,肌电图,心电图和其他类型的数据从生物传感器。

BrainFlow是一个库&#xff0c;旨在获取&#xff0c;解析和分析脑电图&#xff0c;肌电图&#xff0c;心电图和其他类型的数据从生物传感器。 brainflow开源库官网地址 [https://brainflow.readthedocs.io/en/stable/](https://brainflow.readthedocs.io/en/stable/) 它提供了…...

#452. 序列操作

序列操作 - 题目 - Daimayuan Online Judge 问题描述&#xff1a; 思路&#xff1a;首先想的是第二次操作的y可以将前面所以操作进行抵消&#xff0c;只需要第二次操作的最大值即可。但是发现&#xff0c;对于第一个操作&#xff0c;它是单点修改&#xff0c;每修改一次对于第…...

《Python深度学习-Keras》精华笔记3:解决深度学习多分类问题

公众号&#xff1a;机器学习杂货店作者&#xff1a;Peter编辑&#xff1a;Peter 持续更新《Python深度学习》一书的精华内容&#xff0c;仅作为学习笔记分享。 本文是第三篇&#xff1a;介绍如何使用Keras解决Python深度学习中的多分类问题。 多分类问题和二分类问题的区别注意…...

区块链世界的大数据入门之zkMapReduce简介

1. 引言 跨链互操作性的未来将围绕多链dapp之间的动态和数据丰富的关系构建。Lagrange Labs 正在构建粘合剂&#xff0c;以帮助安全地扩展基于零知识证明的互操作性。 2. ZK大数据栈 Lagrange Labs 的ZK大数据栈 为一种专有的证明结构&#xff0c;用于在任意动态分布式计算的…...

Python流程控制语句-条件判断语句练习及应用详解

文章目录 简介条件判断语句&#xff08;if语句&#xff09;练习1&#xff1a;判断奇偶数练习2&#xff1a;判断闰年练习3&#xff1a;计算狗的年龄相当于人的年龄练习4&#xff1a;根据成绩奖励练习5&#xff1a;选择婚姻对象 小结 python 学习专栏推荐python基础知识&#xff…...

(十)ElasticSearch高级使用【别名,重建索引,refresh操作,高亮查询,查询建议】

1.别名使用 1&#xff09;别名作用 在开发中&#xff0c;随着业务需求的迭代&#xff0c;较⽼的业务逻辑就要⾯临更新甚⾄是重构&#xff0c;⽽对于es来说&#xff0c;为了 适应新的业务逻辑&#xff0c;可能就要对原有的索引做⼀些修改&#xff0c;⽐如对某些字段做调整&…...

基于小波神经网络的中药材价格预测,基于ANN的小波神经网络中药材价格预测

目标 背影 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数, BP神经网络的传递函数 小波神经网络(以小波基为传递函数的BP神经网络) 代码链接:基于小波神经网络的中药材价格预测,ANN小波神经网络中药材价格预测资源-CS…...

thinkPhp5返回某些指定字段

//去除掉密码$db new UserModel();$result $db->field(password,true)->where("username{$params[username]} AND password{$params[password]}")->find(); 或者指定要的字段的数组 $db new UserModel();$result $db->field([username,create_time…...

基于docker环境的tomcat开启远程调试

背景&#xff1a; Tomcat部署在docker环境中&#xff0c;使用rancher来进行管理&#xff0c;需要对其进行远程调试。 操作步骤&#xff1a; 1.将容器中的catalina.sh映射出来&#xff0c;便于对其修改&#xff0c;添加远程调试相关参数。 注意&#xff1a;/data/produce2201…...

ELK日志框架图总结

ELK日志框架图总结 本文目录 ELK日志框架图总结Elastic Stack介绍模式分层图beatselasticsearchkibana模式logstashelasticsearchkibana模式beatslogstashelasticsearchkibana模式beats缓存/消息队列logstashelasticsearchkibana模式elkspringboot Elastic Stack介绍 官网&…...

go 每天定时任务 --chatGPT

问&#xff1a;clearLog(hour&#xff0c;cmds),定时执行shell 命令&#xff0c;hour 为每天的几点&#xff0c;cmds 为linux命令数组字符串&#xff08;如 1&#xff0c;{"ls","cd"}&#xff09; gpt: 要编写一个 Go 函数 clearLog&#xff0c;该函数可…...

Lightdb 23.3 plorasql函数支持DML

开篇立意 oracle在函数中使用dml语句时&#xff0c;有两者情况。即&#xff1a;&#xff08;1&#xff09;直接使用select调用该函数&#xff1b;&#xff08;2&#xff09;在匿名块中调用该函数。 针对第一种情况我们测试一下 简单的函数&#xff1a; create table nested_t…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...