1
新建一个项目:

Database01.pro

SOURCES
+=
\

main.cpp
\

Contact.cpp

QT
+=
gui widgets
sql

CONFIG
+=
C++11

HEADERS
+=
\

Contact.h

Contact.h

#ifndef CONTACT_H
#define CONTACT_H
 
#include <QWidget>
#include <QSqlTableModel>
#include <QTableView>
#include <QLineEdit>
#include <QPushButton>
class Contact : public QWidget
{
    Q_OBJECT
public:
    explicit Contact(QWidget *parent);
 
    QSqlTableModel* _model;
    QTableView* _view;
 
    QLineEdit* _filter;
    QPushButton* _add;
    QPushButton* _del;
    QPushButton* _reset;
    QPushButton* _submit;
signals:
 
public slots:
 
    void slotModelDataChanged(QModelIndex,QModelIndex);
    void slotFilterChanged(QString filter);
 
};
 
#endif // CONTACT_H

Contact.cpp

#include "Contact.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QSqlRecord>
#include <QCompleter>
#include <QDebug>
Contact::Contact(QWidget *parent) :
    QWidget(parent)
{
    //创建一个QSqlTableModel
    _model = new QSqlTableModel;
    //创建QTable
    _view = new QTableView;
    //view里面设置model
    _view->setModel(_model);
 
    _model->setTable("tcontact");
    //手动提交
    _model->setEditStrategy(QSqlTableModel::OnManualSubmit);
 
    connect(_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)),
            this, SLOT(slotModelDataChanged(QModelIndex,QModelIndex)));
 
    _model->select();
 
    // set Layout
    QVBoxLayout* vBox = new QVBoxLayout(this);
    vBox->addWidget(_view);
 
    QHBoxLayout* hBox = new QHBoxLayout;
    vBox->addLayout(hBox);
 
    //添加add
    hBox->addWidget(_filter = new QLineEdit, 1);
    hBox->addWidget(_add=new QPushButton("Add"));
    hBox->addWidget(_del=new QPushButton("Del"));
    hBox->addWidget(_reset=new QPushButton("Reset"));
    hBox->addWidget(_submit=new QPushButton("Submit"));
 
    connect(_add, &QPushButton::clicked, [&](){
        QSqlRecord record = _model->record();
        _model->insertRecord(-1, record);
    });
    connect(_del, &QPushButton::clicked, [&](){});
    connect(_reset, &QPushButton::clicked, [&](){});
    connect(_submit, &QPushButton::clicked, [&](){
        _model->submitAll();
    });
 
    //模糊查询
    connect(_filter, SIGNAL(textChanged(QString)),
            this, SLOT(slotFilterChanged(QString)));
 
    slotModelDataChanged(QModelIndex(), QModelIndex());
}
 
void Contact::slotFilterChanged(QString filter)
{
    if(filter.isEmpty())
    {
        _model->setFilter("");
        _model->select();
        return;
    }
    //  username like filter or password like  filter .......
    QSqlRecord record = _model->record();
    QString modelFilter;
    for(int i=0; i<record.count(); ++i)
    {
        if(i!=0)
        {
            modelFilter += " or ";
        }
        QString field = record.fieldName(i);
        QString subFilter = QString().sprintf("%s like '%%%s%%'", field.toUtf8().data(), filter.toUtf8().data());
        //  qDebug() << subFilter;
 
        modelFilter += subFilter;
 
    }
    qDebug() << modelFilter;
    _model->setFilter(modelFilter);
    _model->select();
}
 
void Contact::slotModelDataChanged(QModelIndex,QModelIndex)
{
    QStringList strList;
    for(int i=0; i<_model->rowCount(); ++i)
    {
        QSqlRecord record = _model->record(i);
        for(int j=0; j<record.count(); ++j)
        {
            QVariant var = record.value(j);
            if(var.isNull()) continue;
            strList << var.toString();
        }
    }
    qDebug() << strList;
    QCompleter* completer=new QCompleter(strList);
    _filter->setCompleter(completer);
}

main.cpp

#include <QApplication>
#include "Widget05.h"
#include <QSqlDatabase>
#include <QSqlError>
#include <QDebug>
#include "Contact.h"
 
int main(int argc,char* argv[])
{
    QApplication app(argc,argv);
 
    /*QT可以操作 QSLITE QODBC,QPLSQL 这些数据库*/
    //下面表示使用mysql数据库,因为这里的db没有用到db,所以可以把它放在main中
    //本质:在QT里面打开一个数据库之后,就会保存一个数据库连接,
    //其它的位置就可以任意使用这个全局的变量了
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("127.0.0.1");  //设置数据库所在位置
    db.setUserName("root");       //设置数据库的用户名
    db.setPassword("123456");     //设置数据库的密码
    db.setDatabaseName("d0718");  //设置数据库名称
    bool bRet = db.open();        //打开数据库连接
 
    if(bRet == false)
    {
        //说明可以通过db.lastError()的方式得到错误信息
        qDebug() << "error open database" << db.lastError().text();
        exit(0);
    }
    qDebug() << "open database success";
 
    //注意Widget02要写在上面代码的下面
    Contact c;
    c.show();
    return app.exec();
}

运行结果:

3.QT数据库综合案例,模糊查询等操作的更多相关文章

  1. IOS开发数据库篇—SQLite模糊查询

    IOS开发数据库篇—SQLite模糊查询 一.示例 说明:本文简单示例了SQLite的模糊查询 1.新建一个继承自NSObject的模型 该类中的代码: // // YYPerson.h // 03- ...

  2. Java数据库学习之模糊查询(like )

    Java数据库学习之模糊查询(like ): 第一种方式:直接在SQL语句中进行拼接,此时需要注意的是parm在SQL语句中需要用单引号拼接起来,注意前后单引号之间不能空格 String sql = ...

  3. C# 调用Access数据库关于like模糊查询的写法

    在access查询视图中要使用"*"做模糊匹配,但是在程序中要用%来匹配.在access中:NEIBUBH like '*1234*'在程序中:NEIBUBH like '%123 ...

  4. 小记------mongodb数据库如何进行模糊查询

    // 模糊匹配createTime   是以 2019-07-23 开头 db.getCollection('driver_online_record').find({"createTime ...

  5. 007.Oracle数据库 , 使用%进行模糊查询

    /*Oracle数据库查询日期在两者之间*/ SELECT PKID, OCCUR_DATE, ATA FROM LM_FAULT WHERE ( ( OCCUR_DATE >= to_date ...

  6. Python使用sql语句对mysql数据库多条件模糊查询

    1 def find_worldByName(c_name,continent): 2 print(c_name) 3 print(continent) 4 sql = " SELECT * ...

  7. Redis 模糊查询删除操作

    创建一条测试 数据 查询 创建:set name xiaoming 查询: get name 1.模糊搜索查询 Redis 模糊搜索 keys * 2.删除指定key : # 删除所有以user开头的 ...

  8. Oracle 数据库基础:数据查询与操作

    SELECT uname FROM TUser WHERE uname=‘admin’ SELECT 字段名列表 FROM 表名 WHERE 条件; 在Oracle数据库中,对象是属于模式的,每个账户 ...

  9. Access数据库的模糊查询到底是用*还是%

    今天被用了一下Access数据库,结果被它的模糊查询给折腾了一上午,到底是用*还是%?特此记下来 事情是这样的,我用C#写了个小的窗体程序,访问Access数据库进行一个模糊查询,我先手工往Acces ...

随机推荐

  1. 【BZOJ3531】【SDOI2014】旅行

    题目传送门 题目大意:给定一棵无根树,每个节点有自己的类别和权值,现在给定两个类别相同的点,叫你求这2点路径上同类别节点的权值和/最大权值. 节点类别与权值会改变. 解题思路:考虑对每一个类别开一棵线 ...

  2. ●BZOJ 3551 [ONTAK2010]Peaks(在线)

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3551 题解: 最小生成树 Kruskal,主席树,在线 这个做法挺巧妙的...以Kruska ...

  3. 【UOJ UNR #1】争夺圣杯

    来自FallDream的博客,未经允许,请勿转载,谢谢. 传送门 考虑直接对每个数字,统计它会产生的贡献. 单调栈求出每个数字左边第一个大等于他的数,右边第一个大于他的 (注意只能有一边取等) 假设左 ...

  4. zoj2112 树状数组+主席树 区间动第k大

    Dynamic Rankings Time Limit: 10000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu Subm ...

  5. 笔记9 AOP练习3(通过注解引入新功能 )

    切面可以为Spring bean添加新方法. 在Spring中,切面只是实现了它们所包装bean相同接口的 代理.如果除了实现这些接口,代理也能暴露新接口的话,会怎么样 呢?那样的话,切面所通知的be ...

  6. Java Servlet 笔记2

    1. Servlet的生命周期 Servlet 通过调用 init () 方法进行初始化. Servlet 调用 service() 方法来处理客户端的请求. Servlet 通过调用 destroy ...

  7. C语言程序设计预备作业。

    1. 阅读邹欣老师的博客--师生关系,针对文中的几种师生关系谈谈你的看法,你期望的师生关系是什么样的? 答:我理想中的师生关系是Coach/Trainee(健身教练/健身学员)的关系.因为邹老师就如同 ...

  8. ZhuSuan 是建立在Tensorflow上的贝叶斯深层学习的 python 库

    ZhuSuan 是建立在Tensorflow上的贝叶斯深层学习的 python 库. 与现有的主要针对监督任务设计的深度学习库不同,ZhuSuan 的特点是深入到贝叶斯推理中,从而支持各种生成模式:传 ...

  9. c++ 文件操作详解

    C++ 通过以下几个类支持文件的输入输出: ofstream: 写操作(输出)的文件类 (由ostream引申而来) ifstream: 读操作(输入)的文件类(由istream引申而来) fstre ...

  10. vue通过id从列表页跳转到对应的详情页

    1. 列表页:列表页带id跳转到详情页 详情页:把id传回到后台就可以获取到数据了 2.列表页跳转到详情页并更改详情页的标题 列表页:带id和页面标题的typeid跳转到详情页 详情页:在html绑定 ...