Qt QSqlQueryModel详解

2023-10-31

背景知识:

Qt SQL的API分为不同层:

  1. 驱动层 

 驱动层  对于QT是基于C++来实现的框架,该层主要包括QSqlDriver、QSqlDriverCreator、QSqlDriverCreatorbase、QSqlDriverPlugin and QSqlResult。这一层提供了特定数据库和SQL API层之间的底层桥梁。

  1. SQL API层

SQL API层  对于SQL API 层提供了数据库的访问相关类,其中,QSqlDataBase类进行连接,QSqlQuery完成数据库的交互。除此之外,还有QSqlError、QSqlField、QSqlIndex and QSqlRecord类。

  1. 用户接口层

用户接口层  用户接口层的几个类实现将数据库中的数据链接到窗口部件上,这些类是使用模型/视图框架实现的,他们是更高层次的抽象,主要包括QSqlQureyModel,QSqlTableModel and QSqlRelationalTableModel。

用户接口层的类使用模型/视图框架实现了将数据库中的数据链接到窗口控件上

QTableView是常用的内容显示视图组件。数据模型类有:QSqlQueryModel 、QSqlTableModel 、QSqlRelationalTableModel

QSqlQueryModel :通过设置SELECT语句查询获取内容,Model数据是只读的,不能进行编辑

QSqlTableModel : 直接设置一个数据表的名称,可以获取数据表的全部记录,结果是可编辑的。

QSqlRelationalTableModel: 编辑一个数据表,将代码字段通过关系与代码表关联,将代码字段的编辑转换为直观的内容选择编辑。

QSqlQueryModel

QSqlQueryModel :QSqlQueryModel是QSqlTableModel的父类。通过设置SELECT语句查询获取内容,Model数据是只读的,不能进行编辑。意味着不能再如tableview进行编辑修改数据,也不会有代理出现。

所以需要结合QSqlQuery一起使用。

那如果想编辑修改,只能通过弹出一个对话框的,添加控件的方式进行修改,再结合QSqlQuery操作。

  1. tableview显示数据,即对模型设置。那调用setQuery函数即可。
  2. 修改某条数据,把tableview的数据传到对话框,有2种办法。第一种:直接获取模型某行的数据(调用record函数),第二种:通过QSqlQuery执行sql查询语句。然后把修改后的数据通过QSqlQuery语句更新到数据库,数据模型再重新查询语句(调用QSqlQueryModel 类的query().exec()因为前面执行过一次查询或者setQuery),则会自动更新到tableview.

常用的api函数

//清除数据模型,释放所有获得的数据

virtual void clear();

//返回当前关联的QSqlQuery()对象

QSqlQuery query() const;

//设置一个QSqlQuery对象,获取数据

void setQuery(const QSqlQuery &query);

void setQuery(const QString &queryconst QSqlDatabase &db = QSqlDatabase());

//返回一个空记录,包含当前查询的字段信息

QSqlRecord record() const;

 //返回行号为row的记录

QSqlRecord record(int rowconst;

QSqlQuery

执行任意的SQL语句,直接和数据库打交道,可进行insert、delete、update等操作

优点:

  1. 完全自由编写和执行sql语句,可做任意的查询和操作
  2. 性能高,可直接操作数据库结构
  3. 支持事务

缺点:

  1. 需要自行处理结果集,较复杂
  2. 不支持直接编辑。需要自行在程序中处理添加、修改和删除。

//绑定sql语句

bool prepare(const QStringquery);

void bindValue(const QStringplaceholderconst QVariantval,

                   QSql::ParamType type = QSql::In);

void bindValue(int posconst QVariantvalQSql::ParamType type = QSql::In);

void addBindValue(const QVariantvalQSql::ParamType type = QSql::In);

//执行sql语句

bool exec();

bool exec(const QStringquery);

//执行sql语句后,结果的遍历

bool next();

bool previous();

bool first();

bool last();

//某条数据的字段的值

QVariant value(int iconst;

QVariant value(const QStringnameconst;

例如

    QSqlQuery query = QSqlQuery(db);

query.clear();

bool ret = query.prepare("select * from User WHERE userId=?");

    query.bindValue(0,strid);

    bool ok = query.exec();

    while(query.next())//每一行的数据

    {

        QString qvalue = query.value("userId").toString();

        QString qvalue1 = query.value("username").toString();

        qDebug() << qvalue << qvalue1 <<endl;

    }

//执行sql语句后,当前位置的结果,位置由bool next();bool previous();

bool first();bool last();决定。从而知道是某行的数据

QSqlRecord record() const;

//执行sql语句

void setQuery(const QSqlQuery &query);

void setQuery(const QString &queryconst QSqlDatabase &db = QSqlDatabase());

//返回当前关联的QSqlQuery 对象

QSqlQuery query() const;

不带参数:
    QSqlQuery query = QSqlQuery(db);
    query.clear();
    bool ret = query.exec("CREATE TABLE User ( userId VARCHAR(20) PRIMARY KEY, username VARCHAR(20) )");
query.clear();

带参数:
    QSqlQuery query = QSqlQuery(db);
    bool bret = false;
    query.clear();
    bret = query.prepare("insert into User (userId,username) values (?,?)");
    query.addBindValue(strid);
    query.addBindValue(strname);
    bret = query.exec();
query.clear();
或者
        QSqlQuery query = QSqlQuery(db);
        query.clear();
        query.prepare("delete from User WHERE userId=?");
        query.bindValue(0,strid);
        bool ok = query.exec();
        query.clear();

例子

  1. 数据库使用SQLite数据库,格式为.db3
  2. 模型使用QSqlQueryModel ,视图使用QTableView

打开数据库

void MainWindow::on_actOpenDB_triggered()
{
    QString aFile=QFileDialog::getOpenFileName(this,"选择数据库文件","",
                             "SQL Lite数据库(*.db *.db3)");
    if (aFile.isEmpty())
       return;

//打开数据库
    DB=QSqlDatabase::addDatabase("QSQLITE"); //添加 SQL LITE数据库驱动
    DB.setDatabaseName(aFile); //设置数据库名称
    if (!DB.open())   //打开数据库
    {
        QMessageBox::warning(this, "错误", "打开数据库失败",
                                 QMessageBox::Ok,QMessageBox::NoButton);
        return;
    }

//打开数据表
    openTable();
}

打开数据表,查询数据表的数据到模型

void MainWindow::openTable()
{//打开数据表
    qryModel=new QSqlQueryModel(this);
    theSelection=new QItemSelectionModel(qryModel);

    qryModel->setQuery("SELECT empNo, Name, Gender, Height, Birthday, Mobile, Province, City, Department, "
                       " Education, Salary FROM employee order by empNo");
    if (qryModel->lastError().isValid())
    {
        QMessageBox::information(this, "错误", "数据表查询错误,错误信息\n"+qryModel->lastError().text(),
                                 QMessageBox::Ok,QMessageBox::NoButton);
        return;
    }

    qryModel->setHeaderData(0,Qt::Horizontal,"工号");
    qryModel->setHeaderData(1,Qt::Horizontal,"姓名");
    qryModel->setHeaderData(2,Qt::Horizontal,"性别");
    qryModel->setHeaderData(3,Qt::Horizontal,"身高");
    qryModel->setHeaderData(4,Qt::Horizontal,"出生日期");
    qryModel->setHeaderData(5,Qt::Horizontal,"手机");
    qryModel->setHeaderData(6,Qt::Horizontal,"省份");
    qryModel->setHeaderData(7,Qt::Horizontal,"城市");
    qryModel->setHeaderData(8,Qt::Horizontal,"部门");
    qryModel->setHeaderData(9,Qt::Horizontal,"学历");
    qryModel->setHeaderData(10,Qt::Horizontal,"工资");

    ui->tableView->setModel(qryModel);
    ui->tableView->setSelectionModel(theSelection);
//    ui->tableView->resizeColumnsToContents();
//    ui->tableView->horizontalHeader()->setStretchLastSection(true);

选择行变化时
//    connect(theSelection,SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),
//            this,SLOT(on_currentRowChanged(QModelIndex,QModelIndex)));

    ui->actOpenDB->setEnabled(false);

    ui->actRecInsert->setEnabled(true);
    ui->actRecDelete->setEnabled(true);
    ui->actRecEdit->setEnabled(true);
    ui->actScan->setEnabled(true);
}

添加数据,先使用QSqlQuery 添加到数据库,再从数据库查询到model,最后显示到view

void MainWindow::on_actRecInsert_triggered()
{//插入记录
//    QModelIndex curIndex=theSelection->currentIndex();//获取当前选择单元格的模型索引
//    int curRecNo=theSelection->currentIndex().row();

//    QSqlRecord  curRec=qryModel->record(curRecNo); //获取当前记录
//    int empNo=curRec.value("EmpNo").toInt();

    QSqlQuery query;
    query.exec("select * from employee where EmpNo =-1"); //实际不查询出记录,只查询字段信息
//    query.prepare("select * from employee where EmpNo = :ID");
//    query.bindValue(":ID",empNo);
//    query.exec();
//    query.first();

//    if (!query.isValid())
//        return;

    QSqlRecord curRec=query.record();//获取当前记录,实际为空记录
    curRec.setValue("EmpNo",qryModel->rowCount()+3000);

    WDialogData    *dataDialog=new WDialogData(this);
    Qt::WindowFlags    flags=dataDialog->windowFlags();
    dataDialog->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint); //设置对话框固定大小

    dataDialog->setInsertRecord(curRec); //插入记录
    int ret=dataDialog->exec();// 以模态方式显示对话框
    if (ret==QDialog::Accepted) //OK键被按下
    {
        QSqlRecord  recData=dataDialog->getRecordData();

        query.prepare("INSERT INTO employee (EmpNo,Name,Gender,Height,Birthday,Mobile,Province,"
                      " City,Department,Education,Salary,Memo,Photo) "
                      " VALUES(:EmpNo,:Name, :Gender,:Height,:Birthday,:Mobile,:Province,"
                      " :City,:Department,:Education,:Salary,:Memo,:Photo)");

        query.bindValue(":EmpNo",recData.value("EmpNo"));
        query.bindValue(":Name",recData.value("Name"));
        query.bindValue(":Gender",recData.value("Gender"));
        query.bindValue(":Height",recData.value("Height"));
        query.bindValue(":Birthday",recData.value("Birthday"));
        query.bindValue(":Mobile",recData.value("Mobile"));

        query.bindValue(":Province",recData.value("Province"));
        query.bindValue(":City",recData.value("City"));
        query.bindValue(":Department",recData.value("Department"));
        query.bindValue(":Education",recData.value("Education"));

        query.bindValue(":Salary",recData.value("Salary"));
        query.bindValue(":Memo",recData.value("Memo"));
        query.bindValue(":Photo",recData.value("Photo"));

        if (!query.exec())
            QMessageBox::critical(this, "错误", "插入记录错误\n"+query.lastError().text(),
                                     QMessageBox::Ok,QMessageBox::NoButton);
        else //插入,删除记录后需要重新设置SQL语句查询
//            qryModel->setQuery("SELECT empNo, Name, Gender, Height, Birthday, Mobile, Province, City,"
//                               "Department,Education, Salary FROM employee order by empNo"); //设置数据表
            qryModel->query().exec();//数据模型重新查询数据,更新tableView显示
    }

    delete dataDialog;
}

删除数据

void MainWindow::on_actRecDelete_triggered()
{//删除当前记录
    int curRecNo=theSelection->currentIndex().row();
    QSqlRecord  curRec=qryModel->record(curRecNo); //获取当前记录
    if (curRec.isEmpty()) //当前为空记录
        return;

    int empNo=curRec.value("EmpNo").toInt();//获取员工编号
    QSqlQuery query;
    query.prepare("delete  from employee where EmpNo = :ID");
    query.bindValue(":ID",empNo);

    if (!query.exec())
        QMessageBox::critical(this, "错误", "删除记录出现错误\n"+query.lastError().text(),
                                 QMessageBox::Ok,QMessageBox::NoButton);
    else //插入,删除记录后需要重新设置SQL语句查询
        qryModel->query().exec();
    ui->tableView->update();
//    qryModel->setQuery("SELECT empNo, Name, Gender, Height, Birthday, Mobile, Province, City,"
//                           "Department,Education, Salary FROM employee order by empNo"); //设置数据表
}

修改数据

void MainWindow::on_actRecEdit_triggered()
{//编辑当前记录
//    QModelIndex curIndex=theSelection->currentIndex();//获取当前选择单元格的模型索引
    int curRecNo=theSelection->currentIndex().row();
    updateRecord(curRecNo);
}

void MainWindow::updateRecord(int recNo)
{ //更新一条记录
    QSqlRecord  curRec=qryModel->record(recNo); //获取当前记录
    int empNo=curRec.value("EmpNo").toInt();//获取EmpNo

    QSqlQuery query; //查询出当前记录的所有字段
    query.prepare("select * from employee where EmpNo = :ID");
    query.bindValue(":ID",empNo);
    query.exec();
    query.first();

    if (!query.isValid()) //是否为有效记录
        return;

    curRec=query.record();//获取当前记录的数据
    WDialogData    *dataDialog=new WDialogData(this); //创建对话框
    Qt::WindowFlags    flags=dataDialog->windowFlags();
    dataDialog->setWindowFlags(flags | Qt::MSWindowsFixedSizeDialogHint); //设置对话框固定大小

    dataDialog->setUpdateRecord(curRec);//调用对话框函数更新数据和界面
    int ret=dataDialog->exec();// 以模态方式显示对话框
    if (ret==QDialog::Accepted) //OK键被按下
    {
        QSqlRecord  recData=dataDialog->getRecordData(); //获得对话框返回的记录

        query.prepare("update employee set Name=:Name, Gender=:Gender,Height=:Height,"
                      " Birthday=:Birthday, Mobile=:Mobile, Province=:Province,"
                      " City=:City, Department=:Department, Education=:Education,"
                      " Salary=:Salary, Memo=:Memo, Photo=:Photo "
                      " where EmpNo = :ID");

        query.bindValue(":Name",recData.value("Name"));
        query.bindValue(":Gender",recData.value("Gender"));
        query.bindValue(":Height",recData.value("Height"));
        query.bindValue(":Birthday",recData.value("Birthday"));
        query.bindValue(":Mobile",recData.value("Mobile"));

        query.bindValue(":Province",recData.value("Province"));
        query.bindValue(":City",recData.value("City"));
        query.bindValue(":Department",recData.value("Department"));
        query.bindValue(":Education",recData.value("Education"));

        query.bindValue(":Salary",recData.value("Salary"));
        query.bindValue(":Memo",recData.value("Memo"));
        query.bindValue(":Photo",recData.value("Photo"));

        query.bindValue(":ID",empNo);

        if (!query.exec())
            QMessageBox::critical(this, "错误", "记录更新错误\n"+query.lastError().text(),
                                     QMessageBox::Ok,QMessageBox::NoButton);
        else
            qryModel->query().exec();//数据模型重新查询数据,更新
    }
    delete dataDialog;
}

查询数据

查询数据,直接调用setQuery函数即可,这样view只显示查询的字段
void MainWindow::on_actScan_triggered()
{
    qryModel->setQuery("select empNo, Name from employee where empNo='1001'");
}
或者是好像属于执行了2次查询了
void MainWindow::on_actScan_triggered()
{
    QSqlQuery qryEmpList(DB); //员工工资信息列表
    bool bok = qryEmpList.prepare("SELECT empNo, Name, Gender FROM employee where empNo=?");
    qryEmpList.bindValue(0,"1001");
    bok = qryEmpList.exec();//这步必须执行,
    qryModel->setQuery(qryEmpList);

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt QSqlQueryModel详解 的相关文章

  • QMessageBox::about 可以根据标题长度调整大小吗?

    我想创建一个简单的 关于 对话框 但注意到QMessageBox about不会根据标题的长度调整其大小 由于字体较大 标题通常会更长 至少在我的桌面环境中 仅根据内容调整其大小 有没有办法确保对话框足够大以显示所有标题 我当然可以向 ab
  • cmake 找不到 Qt4

    由于4 8 0已经发布 我重新安装了Qt 现在我也想使用cmake 为了使 cmake 工作 我记得必须添加 mingw bin 文件夹 QtSDK Desktop Qt 4 7 3 到Qt4 7 3中的PATH 所以我猜测在中会有一个类似
  • 如何在Qt3D中优化点云渲染

    我正在尝试使用 Qt3D 显示大型点云 20M pts 我第一次发现这个图书馆https github com MASKOR Qt3DPointcloudRenderer https github com MASKOR Qt3DPointc
  • 在 Windows 上从源代码构建 PhantomJS-2

    我正在尝试基于这些在 Windows 8 1 x64 上从源代码构建 PhantomJS 2 的开发版本指示 https github com ariya phantomjs wiki PhantomJS 2 但是我收到以下错误 mingw
  • C++ QT libXL 错误:“启动期间程序退出,代码为 0xc0000135”

    我正在尝试编写一个使用 libXL 的 QT 应用程序 但是当我尝试编译时 我收到一个弹出框 显示 During Startup program exited with code 0xc0000135 我已经准确地找出了哪一行导致了问题 它
  • QGraphicsSimpleTextItem“无效使用不完整类型”

    我的代码如下 指针部件 h QGraphicsSimpleTextItem text 指针控件 cpp void PointerWidget placeNumbers float spacing int currentTickNumber
  • 当给定 100k 项时,QListView 需要很长时间才能更新

    我在读取文件时遇到问题 具体是我想制作一本小字典 在我需要阅读的文件中有这样的内容 a Ph P6 a snsr CA a b c fb Dj a b c book i BS A except B gate oOPa y a font kQ
  • qvariant 作为 qhash 中的键

    我想创建一个带有 QVariants 键的数据结构 它看起来像这样 QHash
  • 如何通过信号和槽传递参数?

    我的 GUI 包括LineEdit and a 按钮 当 的时候按钮单击后 插槽clicked 叫做 我想在之间建立信号槽关系clicked 作为信号和doSomething 作为插槽 问题是doSomething 无权访问 UI 并且do
  • 更改 Qt 中的语言环境

    我尝试使用 QLocale 和 setDefault 函数更改区域设置 但似乎不起作用 以下是使用 C 本地化库和 QLocale 更改语言环境的示例 对于 C 本地化库 它似乎可以工作 但对于 QLocale setDefault 函数调
  • QtWebEngine Quicknano 在嵌入式 Linux 中没有声音

    我已将 QtWebEngine 编译到我的 i MX6 嵌入式设备中 当我尝试使用 Quicknanobrowser 播放 YouTube 视频时 视频会播放 但没有声音 事实上 当我尝试播放音频文件时没有声音hpr dogphilosop
  • Qt:关闭模式对话框关闭程序

    在我的 Qt 程序中 我有 2 个窗口 主窗口和子窗口 在程序中 一次仅显示这些窗口之一 主窗口有一个插槽 用于创建模式对话框 现在 假设子窗口中单击按钮的信号被发送到该插槽 在这种情况下 主窗口隐藏 子窗口可见 对话框显示得很好 但是当对
  • 如何改善 Qt5 程序的启动时间?

    我最近切换到 Qt5 我注意到与 Qt4 相比 初始化 QApplication 花费的时间明显更长 大约几分钟 仔细一看 程序似乎把时间花在了这里 Qt5Guid dll QGlobalStatic
  • 在 Qt 中旋转图像

    在我的应用程序中 我想旋转图像 我已将图像设置为QLabel 我已经设置了一个QPushButton 单击该按钮时我想向四个方向旋转图像 右 gt 底部 gt 左 gt 顶部 有什么帮助吗 假设您有一个指向 QLabel 的指针 您可以执行
  • 在未安装 Qt VS Tools 的情况下以 Qt/MsBuild 格式编译 Qt 项目

    我在 Visual Studio 中有很多 Qt 项目 使用新的 Qt MsBuild 格式 https blog qt io blog 2018 02 16 qt visual studio improving performance 由
  • { Qt5.0.2/QML/QtQuick2.0/C++ } 运行没有错误的示例项目? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我的设置是Qt5 0 2 MinGW 32位 我在寻找 Qt5 0 2 QML QtQuick2 0 C 代码项目示例 不是Qt Qu
  • QGraphicsScene没有删除QWidget的功能

    QGraphicsScene 有一个addWidget QWidget 有函数 但是没有对应的removeWidget QWidget 它只有removeItem QGraphicsItem 如何删除 QWidget 这是一个基本示例 看看
  • 如何在 QT 安装程序框架中区分每用户安装与系统范围安装?

    我正在使用一些名为 pgModeler 的应用程序 它的当前版本提供了一个基于 QT 安装程序框架的安装程序 Windows 上该安装程序的问题是它安装每个用户的开始菜单条目 https github com pgmodeler pgmod
  • QPainter 性能高帧率

    我试图在 QPainter 中以 60fps 的速度显示视频 在 OpenGLwidget 中 我遇到一个问题 有时绘图花费的时间太长 并且在使用 QPainter 时发生下一个重绘事件 这会生成警告和随机崩溃 有几个问题 是否有一种 Qt
  • 加载 QPixmap 数据的更好方法

    更好的方法来做到这一点 没有QImage QImage image width height QImage Format RGB888 memcpy image bits m frameRGB gt data 0 height width

随机推荐

  • 解决kibana启动时:3005 - wrong protocol being used to connect to the wazuh api 和 Wazuh API seems to be dow

    解决elasticsearch缺少模板问题 https mp csdn net editor html 112570396 后 依然不能正常检测到 wazuh api 状态 默认ip和端口 现在 解决kibana启动时 3005 wrong
  • Git教程---Windows安装及命令使用(详细例子)

    目录 一 Git的工作原理 二 Git下载及安装 三 Git配置 四 Git命令 示例 参考链接 一 Git的工作原理 Git有四个工作区域 其中三个工作区域工作在本地 一个工作区域工作在远程仓库 本地目录 工作区 平时存放项目代码的位置
  • 使用 Grid 进行常见布局

    grid 布局是W3C提出的一个二维布局系统 通过 display grid 来设置使用 对于以前一些复杂的布局能够得到更简单的解决 本篇文章通过几个布局来对对 grid 布局进行一个简单的了解 目前 grid 仅仅只有 Edge使用前缀能
  • 【windows系统】通过SSH Key访问服务器

    BG 废话不多说 直接上干货 1 终端输入命令 ssh username server 确认是否有自己的用户名 2 查看是否生成过SSH Key ls ssh 未生成过 提示 No such file or directory 生成过 提示
  • 旅游推荐平台

    作者主页 编程千纸鹤 作者简介 Java 前端 Python开发多年 做过高程 项目经理 架构师 主要内容 Java项目开发 毕业设计开发 面试技术整理 最新技术分享 收藏点赞不迷路 关注作者有好处 文末获得源码 项目编号 BS XX 05
  • Flask从入门到做出一个博客的大型教程(三)

    Flask从入门到做出一个博客的大型教程 三 在开始之前 先来看下项目的整体结构 flask app forms py init py routes py templates base html index html login html
  • 导入别人的安卓项目方法-需要修改的配置(Androidstudio)通用解决办法

    导入别人的安卓项目方法 一般导入别人的安卓项目后会遇到一些问题 下面是通用方法 绝大多数情况都能运行出来 步骤一 导入别人的项目报错 步骤二 Androidstudio新建一个空项目 步骤三 找到两个build gradle文件 这两个就是
  • 2021年江苏省职业院校技能大赛中职 网络信息安全赛项试卷--攻击日志解析

    2021年江苏省职业院校技能大赛中职 网络信息安全赛项 attack pacapng攻击日志分析 2021年江苏省攻击日志分析任务书 2021年江苏省攻击日志分析任务书解析 如果有不懂得地方可以私信博主 欢迎交流 交流群 603813289
  • java <? extends T>和<? super T>介绍(一)

  • python安装&配置环境(win10)

    python安装 配置环境 win10 1 打开python官网下载python安装包 操作步骤如下所示 点击 gt python官网链接 1 1 进入官网 1 2 进入下载页面 1 3 选择指定版本的python 本文选择python3
  • 高德地图JS API升级到2.0版本

    项目上反馈高德地图底图信息更新不及时 不利于进行点位规划 经研究发现高德地图JS API 1 4 15版本相对于2 0版本 确实地图切片上的标注信息较少 通过工单的形式询问高德的技术工程师认识到1 4 15版本数据更新有延迟 1 4 15版
  • cin与scanf cout与printf效率问题

    在竞赛中 遇到大数据时 往往读文件成了程序运行速度的瓶颈 需要更快的读取方式 相信几乎所有的C 学习者都在cin机器缓慢的速度上栽过跟头 于是从此以后发誓不用cin读数据 还有人说Pascal的read语句的速度是C C 中scanf比不上
  • warning C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型

    这种警告出现在变量表示范围的临界状态 一 溢出问题 int main int a 2147483648 return 0 在已经定义死int型的情况下 影响不大 但是下面的例子却会由很大的影响 二 类型转化 int main if 2147
  • C语言---数组名与&数组名的区别

    今天在用strsep函数 有一个是双指针类型的形参 的时候 我以为 数组名就是 双指针类型的 但结果却不对 后来查了才知道 虽然数组名与 数组名的值是相同的 但是 他们的类型是不一样的 char str 10 str 的值为str 0 的地
  • JavaScript常见的运用场景

    JavaScript是一种相当流行 高效 便捷的脚本语言 它在 web 开发中发挥着重要的作用 下面我们来介绍下 JavaScript 常见的运用场景 1 网页动态效果制作 JavaScript 可以用来制作网页的多种动态效果 包括但不限于
  • 低功耗技术(一)动态功耗与静态功耗

    一 动态功耗 翻转功耗 Switching Power 翻转功耗是由充放电电容引起的动态功耗 其推导过程很简单 但是这个最终的结果却十分重要 1 switching power 和负载电容 电压 0到1变化事件的发生次数 时钟频率有关 2
  • Tomcat任意写入文件漏洞(CVE-2017-12615)

    声明 好好学习 天天向上 漏洞描述 2017年9月19日 Apache Tomcat官方确认并修复了两个高危漏洞 漏洞CVE编号 CVE 2017 12615和CVE 2017 12616 其中 远程代码执行漏洞 CVE 2017 1261
  • CSS——网易云音乐首页导航栏的制作

    文章目录 前言 一 结构的布局 二 实现过程 1 HTML结构 2 CSS样式 总结 前言 本文主要介绍了网易云导航栏的制作过程 这个案例中将会运用到CSS中的浮动 绝对定位等相关知识点 这些在以往的文章里有所介绍 一 结构的布局 示例图
  • js数组去重(9种方法),你都会了吗?

    以下共有九种数组去重的方式和详解 包含对象数组去重 1 利用Array from new Set 去重 1 利用set去重 Set是es6新增的数据结构 似于数组 但它的一大特性就是所有元素都是唯一的 没有重复的值 我们一般称为集合 Arr
  • Qt QSqlQueryModel详解

    背景知识 Qt SQL的API分为不同层 驱动层 驱动层 对于QT是基于C 来实现的框架 该层主要包括QSqlDriver QSqlDriverCreator QSqlDriverCreatorbase QSqlDriverPlugin a