点击上方“Qt学视觉”,选择“星标”公众号重磅干货,第一时间送达

想要学习的同学们还请认真阅读每篇文章,相信你一定会有所收获

1、QSqlTableModel的主要函数如下

  • 1、QSqlDatabase database() const

    • 返回其数据库连接

  • 2、void setTable(const QString &tableName)

    • 设置数据表名称,不立即读取记录,但会提取字段信息

  • 3、QString tableName() const

    • 但会设置的数据表名称

  • 4、void setFilter(const QString &filter)

    • 设置记录过滤条件

  • 5、void setSort(int column, Qt::SortOrder order)

    • 设置排序字段和排序规则,需调用select()才生效

  • 6、void sort(int column, Qt::SortOrder order)

    • 按列号和排序规则立即进行排序并获取数据

  • 7、void setEditStrategy(QSqlTableModel::EditStrategy strategy)

    • 设置编辑策略

  • 8、bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole)

    • 设置表头,一般用于设置字段的显示名称

  • 9、int fieldIndex(const QString &fieldName) const

    • 根据字段名称返回其在模型中的字段序号,若字段不存在则返回-1

  • 10、bool isDirty() const

    • 若有未更新到数据库的修改,就返回true,否则返回false

  • 11、QSqlIndex primaryKey() const

    • 返回数据表的主索引

  • 12、int rowCount(const QModelIndex &parent = QModelIndex()) const

    • 返回记录条数

  • 13、bool select()

    • 查询数据表的数据,并使用设置的排序和过滤规则

  • 14、bool selectRow(int row)

    • 刷新获取指定行号的记录

  • 15、void clear()

    • 清除数据模型,释放所有获取的数据

  • 16、QSqlRecord record() const

    • 返回一条空记录,只有字段名,可用来获取字段信息

  • 17、QSqlRecord record(int row) const

    • 返回行号为row的一条记录,包含记录的数据

  • 18、bool setRecord(int row, const QSqlRecord &values)

    • 更新一条记录的数据到数据模型,源和目标之间用过字段名称匹配,而不是按位置匹配

  • 19、bool insertRecord(int row, const QSqlRecord &record)

    • 在行号row之前插入一条记录

  • 20、bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex())

    • 在行号row之前插入count空行,编辑策略为OnFieldChange或OnRowChange时只能插入一行

  • 21、bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex())

    • 从行号row开始,删除count行,若编辑策略为OnManualSubmit,需调用submitAll()才从数据表里删除

  • 22、void revertRow(int row)

    • 取消行号为row的记录的修改

  • 23、void revert()

    • 编辑策略为OnRowChange或OnFieldChange时,取消当前行的修改,对OnManualSubmit编辑策略无效

  • 24、void revertAll()

    • 取消所有未提交的修改

  • 25、bool submit()

    • 提交当前行的修改到数据库,对OnManualSubmit编辑策略无效

  • 26、bool submitAll()

    • 提交所有未更新的修改到数据库,若成功则返回true,否则返回false,错误的详细信息可以从lastError()获取

2、QSqlRecord的主要函数如下

QSqlRecord封装了对记录的字段定义和数据的操作

  • 1、void clear()

    • 清除记录的所有字段定义和数据

  • 2、void clearValues()

    • 清除所有字段的数据,将字段数据内容设置为null

  • 3、bool contains(const QString &name) const

    • 判断记录是否含有名称为name的字段

  • 4、bool isEmpty() const

    • 若字段里没有字段返回true,否则返回false

  • 5、int count() const

    • 返回记录的字段个数

  • 6、QString fieldName(int index) const

    • 返回序号为index的字段的名称

  • 7、int indexOf(const QString &name) const

    • 返回字段名称为name的字段的序号,如果字段不存在则返回-1

  • 8、QSqlField field(const QString &name) const

    • 返回字段名称为name的字段对象

  • 9、QVariant value(const QString &name) const

    • 返回字段名称为name的字段的值

  • 10、void setValue(const QString &name, const QVariant &val)

    • 设置字段名称为name的字段的值为val

  • 11、bool isNull(const QString &name) const

    • 判断字段名称为name的字段数据是否为null

  • 12、void setNull(const QString &name)

    • 设置名称为name的字段的值为null

3、QSqlField的主要函数如下

  • 1、void clear()

    • 清除字段数据,设为NULL,如果字段是只读的,则不清除

  • 2、bool isNull() const

    • 判断字段值是否为NULL

  • 3、void setReadOnly(bool readOnly)

    • 设置一个字段为只读,只读的字段不能用setValue()函数设置值,也不能用clear()函数清除值

  • 4、QVariant value() const

    • 返回字段的值

  • 5、void setValue(const QVariant &value)

    • 设置字段的值

例程如下

头文件

#pragma once#include #include "ui_QGuiSql.h"#include #include #include #include #include "QComboboxDelegate.h"class QGuiSql : public QMainWindow{    Q_OBJECTpublic:    QGuiSql(QWidget* parent = Q_NULLPTR);    ~QGuiSql();private:    Ui::QGuiSql ui;private:    QSqlDatabase  m_sqlDB;//数据库连接    QSqlTableModel* m_pTabModel;  //数据模型    QItemSelectionModel* m_pSelection; //选择模型    QDataWidgetMapper* m_pDataMapper; //数据映射    QComboBoxDelegate m_delegateSex; //自定义数据代理,性别    QComboBoxDelegate m_delegateDepart; //自定义数据代理,部门private slots:    void Selection_currentChanged(const QModelIndex& current, const QModelIndex& previous);    void Selection_currentRowChanged(const QModelIndex& current, const QModelIndex& previous);    void actOpenDB_triggered();//打开数据表    void actAppend_triggered();//添加    void actInsert_triggered();//插入    void actDelete_triggered();//删除    void actPhoto_triggered();//设置照片    void actPhotoClear_triggered();//清除照片    void actScan_triggered();//涨工资,记录遍历    void actFields_triggered();//字段列表    void actSubmit_triggered();//保存    void actRevert_triggered();//取消    void radioBtnAscend_clicked();//升序    void radioBtnDescend_clicked();//降序    void radioBtnMan_clicked();//男过滤    void radioBtnWoman_clicked();//女过滤    void radioBtnBoth_clicked();//男女过滤    void comboFields_currentIndexChanged(int index);};

源文件

#include "QGuiSql.h"#include #include #include #include #include #pragma execution_character_set("utf-8")QGuiSql::QGuiSql(QWidget* parent)    : QMainWindow(parent){    ui.setupUi(this);    // tableView显示属性设置    ui.tableView->setSelectionBehavior(QAbstractItemView::SelectItems);    ui.tableView->setSelectionMode(QAbstractItemView::SingleSelection);    ui.tableView->setAlternatingRowColors(true);    ui.tableView->resizeColumnsToContents();    ui.tableView->horizontalHeader()->setStretchLastSection(true);    connect(ui.actOpenDB, SIGNAL(triggered()), this, SLOT(actOpenDB_triggered()));    connect(ui.actAppend, SIGNAL(triggered()), this, SLOT(actAppend_triggered()));    connect(ui.actInsert, SIGNAL(triggered()), this, SLOT(actInsert_triggered()));    connect(ui.actDelete, SIGNAL(triggered()), this, SLOT(actDelete_triggered()));    connect(ui.actPhoto, SIGNAL(triggered()), this, SLOT(actPhoto_triggered()));    connect(ui.actPhotoClear, SIGNAL(triggered()), this, SLOT(actPhotoClear_triggered()));    connect(ui.actScan, SIGNAL(triggered()), this, SLOT(actScan_triggered()));    connect(ui.actFields, SIGNAL(triggered()), this, SLOT(actFields_triggered()));    connect(ui.actSubmit, SIGNAL(triggered()), this, SLOT(actSubmit_triggered()));    connect(ui.actRevert, SIGNAL(triggered()), this, SLOT(actRevert_triggered()));    connect(ui.radioBtnAscend, SIGNAL(clicked()), this, SLOT(radioBtnAscend_clicked()));    connect(ui.radioBtnDescend, SIGNAL(clicked()), this, SLOT(radioBtnDescend_clicked()));    connect(ui.radioBtnMan, SIGNAL(clicked()), this, SLOT(radioBtnMan_clicked()));    connect(ui.radioBtnWoman, SIGNAL(clicked()), this, SLOT(radioBtnWoman_clicked()));    connect(ui.radioBtnBoth, SIGNAL(clicked()), this, SLOT(radioBtnBoth_clicked()));    connect(ui.comboFields, SIGNAL(currentIndexChanged(int)), this, SLOT(comboFields_currentIndexChanged(int)));}QGuiSql::~QGuiSql(){}void QGuiSql::Selection_currentChanged(const QModelIndex& current, const QModelIndex& previous){    //更新actPost和actCancel 的状态    Q_UNUSED(current);    Q_UNUSED(previous);    ui.actSubmit->setEnabled(m_pTabModel->isDirty()); //有未保存修改时可用    ui.actRevert->setEnabled(m_pTabModel->isDirty());}void QGuiSql::Selection_currentRowChanged(const QModelIndex& current, const QModelIndex& previous){    Q_UNUSED(previous);    // 行切换时的状态控制    ui.actDelete->setEnabled(current.isValid());    ui.actPhoto->setEnabled(current.isValid());    ui.actPhotoClear->setEnabled(current.isValid());    if (!current.isValid())    {        ui.dbLabPhoto->clear(); //清除图片显示        return;    }    m_pDataMapper->setCurrentIndex(current.row()); //更细数据映射的行号    int curRecNo = current.row();//获取行号    QSqlRecord  curRec = m_pTabModel->record(curRecNo); //获取当前记录    if (curRec.isNull("Photo"))  //图片字段内容为空    {        ui.dbLabPhoto->clear();    }    else    {        QByteArray data = curRec.value("Photo").toByteArray();        QPixmap pic;        pic.loadFromData(data);        ui.dbLabPhoto->setPixmap(pic.scaledToWidth(ui.dbLabPhoto->size().width()));    }}//QTableView的SelectionModel的行发生了变化,进行处理void QGuiSql::on_currentRowChanged(const QModelIndex& current, const QModelIndex& previous){    Q_UNUSED(previous);    // 行切换时的状态控制    ui.actRecDelete->setEnabled(current.isValid());    if (!current.isValid())    {        ui.dbLabPhoto->clear(); //清除图片显示        return;    }    m_pDataMapper->setCurrentModelIndex(current);//更新数据映射的行号    bool first = (current.row() == 0); //是否首记录    bool last = (current.row() == m_pQryModel->rowCount() - 1);//是否尾记录    ui.actRecFirst->setEnabled(!first); //更新使能状态    ui.actRecPrevious->setEnabled(!first);    ui.actRecNext->setEnabled(!last);    ui.actRecLast->setEnabled(!last);    int curRecNo = m_pSelection->currentIndex().row();    QSqlRecord  curRec = m_pQryModel->record(curRecNo); //获取当前记录    int empNo = curRec.value("EmpNo").toInt();    QSqlQuery query; //查询当前empNo的Memo和Photo字段的数据    query.prepare("select EmpNo, Memo, Photo from employee where EmpNo = :ID");    query.bindValue(":ID", empNo);    query.exec();    query.first();    QVariant va = query.value("Photo");//    if (!va.isValid())  //图片字段内容为空    {        ui.dbLabPhoto->clear();    }    else    {        //显示照片        QByteArray data = va.toByteArray();        QPixmap pic;        pic.loadFromData(data);        ui.dbLabPhoto->setPixmap(pic.scaledToWidth(ui.dbLabPhoto->size().width()));    }    va = query.value("Memo");//显示备注    ui.dbEditMemo->setPlainText(va.toString());}//打开数据表void QGuiSql::actOpenDB_triggered(){    QString aFile = QFileDialog::getOpenFileName(this, "选择数据库文件", "", "SQL Lite数据库(*.db *.db3)");    if (aFile.isEmpty())  //选择SQL Lite数据库文件        return;    //打开数据库    m_sqlDB = QSqlDatabase::addDatabase("QSQLITE"); //添加 SQL LITE数据库驱动    m_sqlDB.setDatabaseName(aFile); //设置数据库名称    //DB.setHostName();    //DB.setUserName();    //DB.setPassword();    if (!m_sqlDB.open())   //打开数据库    {        QMessageBox::warning(this, "错误", "加载数据库失败", QMessageBox::Ok, QMessageBox::NoButton);        return;    }    //打开数据表    m_pTabModel = new QSqlTableModel(this, m_sqlDB);//数据表    m_pTabModel->setTable("employee"); //设置数据表    m_pTabModel->setEditStrategy(QSqlTableModel::OnManualSubmit);//数据保存方式,OnManualSubmit , OnRowChange    m_pTabModel->setSort(m_pTabModel->fieldIndex("empNo"), Qt::AscendingOrder); //排序    if (!(m_pTabModel->select()))//查询数据    {        QString szText = QString("打开数据表错误,错误信息 1%\n").arg(m_pTabModel->lastError().text());        QMessageBox::critical(this, "错误信息", szText, QMessageBox::Ok, QMessageBox::NoButton);        return;    }    //字段显示名    m_pTabModel->setHeaderData(m_pTabModel->fieldIndex("empNo"), Qt::Horizontal, "工号");    m_pTabModel->setHeaderData(m_pTabModel->fieldIndex("Name"), Qt::Horizontal, "姓名");    m_pTabModel->setHeaderData(m_pTabModel->fieldIndex("Gender"), Qt::Horizontal, "性别");    m_pTabModel->setHeaderData(m_pTabModel->fieldIndex("Height"), Qt::Horizontal, "身高");    m_pTabModel->setHeaderData(m_pTabModel->fieldIndex("Birthday"), Qt::Horizontal, "出生日期");    m_pTabModel->setHeaderData(m_pTabModel->fieldIndex("Mobile"), Qt::Horizontal, "手机");    m_pTabModel->setHeaderData(m_pTabModel->fieldIndex("Province"), Qt::Horizontal, "省份");    m_pTabModel->setHeaderData(m_pTabModel->fieldIndex("City"), Qt::Horizontal, "城市");    m_pTabModel->setHeaderData(m_pTabModel->fieldIndex("Department"), Qt::Horizontal, "部门");    m_pTabModel->setHeaderData(m_pTabModel->fieldIndex("Education"), Qt::Horizontal, "学历");    m_pTabModel->setHeaderData(m_pTabModel->fieldIndex("Salary"), Qt::Horizontal, "工资");    m_pTabModel->setHeaderData(m_pTabModel->fieldIndex("Memo"), Qt::Horizontal, "备注"); //这两个字段不再tableView中显示    m_pTabModel->setHeaderData(m_pTabModel->fieldIndex("Photo"), Qt::Horizontal, "照片");    //关联选择模型    m_pSelection = new QItemSelectionModel(m_pTabModel);    //theSelection当前项变化时触发currentChanged信号    connect(m_pSelection, SIGNAL(currentChanged(QModelIndex, QModelIndex)),        this, SLOT(Selection_currentChanged(QModelIndex, QModelIndex)));    //选择行变化时    connect(m_pSelection, SIGNAL(currentRowChanged(QModelIndex, QModelIndex)),        this, SLOT(Selection_currentRowChanged(QModelIndex, QModelIndex)));    ui.tableView->setModel(m_pTabModel);//设置数据模型    ui.tableView->setSelectionModel(m_pSelection); //设置选择模型    ui.tableView->setColumnHidden(m_pTabModel->fieldIndex("Memo"), true);//隐藏列    ui.tableView->setColumnHidden(m_pTabModel->fieldIndex("Photo"), true);//隐藏列    //tableView上为“性别”和“部门”两个字段设置自定义代理组件    QStringList strList;    strList << "男" << "女";    bool isEditable = false;    m_delegateSex.setItems(strList, isEditable);    ui.tableView->setItemDelegateForColumn(m_pTabModel->fieldIndex("Gender"), &m_delegateSex); //Combbox选择型    strList.clear();    strList << "销售部" << "技术部" << "生产部" << "行政部";    isEditable = true;    m_delegateDepart.setItems(strList, isEditable);    ui.tableView->setItemDelegateForColumn(m_pTabModel->fieldIndex("Department"), &m_delegateDepart); //Combbox选择型    //创建界面组件与数据模型的字段之间的数据映射    m_pDataMapper = new QDataWidgetMapper();    m_pDataMapper->setModel(m_pTabModel);//设置数据模型    m_pDataMapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);//    //dataMapper->setItemDelegate(new QSqlRelationalDelegate(this)); //含有外键的    //界面组件与tabModel的具体字段之间的联系    m_pDataMapper->addMapping(ui.dbSpinEmpNo, m_pTabModel->fieldIndex("empNo"));    m_pDataMapper->addMapping(ui.dbEditName, m_pTabModel->fieldIndex("Name"));    m_pDataMapper->addMapping(ui.dbComboSex, m_pTabModel->fieldIndex("Gender"));    m_pDataMapper->addMapping(ui.dbSpinHeight, m_pTabModel->fieldIndex("Height"));    m_pDataMapper->addMapping(ui.dbEditBirth, m_pTabModel->fieldIndex("Birthday"));    m_pDataMapper->addMapping(ui.dbEditMobile, m_pTabModel->fieldIndex("Mobile"));    m_pDataMapper->addMapping(ui.dbComboProvince, m_pTabModel->fieldIndex("Province"));    m_pDataMapper->addMapping(ui.dbEditCity, m_pTabModel->fieldIndex("City"));    m_pDataMapper->addMapping(ui.dbComboDep, m_pTabModel->fieldIndex("Department"));    m_pDataMapper->addMapping(ui.dbComboEdu, m_pTabModel->fieldIndex("Education"));    m_pDataMapper->addMapping(ui.dbSpinSalary, m_pTabModel->fieldIndex("Salary"));    m_pDataMapper->addMapping(ui.dbEditMemo, m_pTabModel->fieldIndex("Memo"));    //m_pDataMapper->addMapping(ui->dbPhoto,tabModel->fieldIndex("Photo")); //图片无法直接映射    m_pDataMapper->toFirst();//移动到首记录    QSqlRecord  emptyRec = m_pTabModel->record();//获取空记录,只有字段名    for (int i = 0; i < emptyRec.count(); i++)        ui.comboFields->addItem(emptyRec.fieldName(i));    //更新actions和界面组件的使能状态    ui.actOpenDB->setEnabled(false);    ui.actAppend->setEnabled(true);    ui.actInsert->setEnabled(true);    ui.actDelete->setEnabled(true);    ui.actScan->setEnabled(true);    ui.groupBoxSort->setEnabled(true);    ui.groupBoxFilter->setEnabled(true);}//添加void QGuiSql::actAppend_triggered(){    m_pTabModel->insertRow(m_pTabModel->rowCount(), QModelIndex()); //在末尾添加一个记录    QModelIndex curIndex = m_pTabModel->index(m_pTabModel->rowCount() - 1, 1);//创建最后一行的ModelIndex    m_pSelection->clearSelection();//清空选择项    m_pSelection->setCurrentIndex(curIndex, QItemSelectionModel::Select);//设置刚插入的行为当前选择行    int currow = curIndex.row(); //获得当前行    m_pTabModel->setData(m_pTabModel->index(currow, 0), 2000 + m_pTabModel->rowCount()); //自动生成编号    m_pTabModel->setData(m_pTabModel->index(currow, 2), "男");}//插入void QGuiSql::actInsert_triggered(){    QModelIndex curIndex = ui.tableView->currentIndex();    m_pTabModel->insertRow(curIndex.row(), QModelIndex());    m_pSelection->clearSelection();//清除已有选择    m_pSelection->setCurrentIndex(curIndex, QItemSelectionModel::Select);}//删除void QGuiSql::actDelete_triggered(){    QModelIndex curIndex = m_pSelection->currentIndex();//获取当前选择单元格的模型索引    m_pTabModel->removeRow(curIndex.row()); //删除最后一行}//设置照片void QGuiSql::actPhoto_triggered(){    QString aFile = QFileDialog::getOpenFileName(this, "选择图片文件", "", "照片(*.jpg)");    if (aFile.isEmpty())        return;    QByteArray data;    QFile* file = new QFile(aFile); //fileName为二进制数据文件名    file->open(QIODevice::ReadOnly);    data = file->readAll();    file->close();    int curRecNo = m_pSelection->currentIndex().row();    QSqlRecord  curRec = m_pTabModel->record(curRecNo); //获取当前记录    curRec.setValue("Photo", data); //设置字段数据    m_pTabModel->setRecord(curRecNo, curRec);    QPixmap pic;    pic.load(aFile);  //在界面上显示    ui.dbLabPhoto->setPixmap(pic.scaledToWidth(ui.dbLabPhoto->width()));}//清除照片void QGuiSql::actPhotoClear_triggered(){    int curRecNo = m_pSelection->currentIndex().row();    QSqlRecord  curRec = m_pTabModel->record(curRecNo); //获取当前记录    curRec.setNull("Photo");//设置为空值    m_pTabModel->setRecord(curRecNo, curRec);    ui.dbLabPhoto->clear();}//涨工资,记录遍历void QGuiSql::actScan_triggered(){    if (m_pTabModel->rowCount() == 0)        return;    for (int i = 0; i < m_pTabModel->rowCount(); i++)    {        QSqlRecord aRec = m_pTabModel->record(i); //获取当前记录        float salary = aRec.value("Salary").toFloat();        salary = salary * 1.1;        aRec.setValue("Salary", salary);        m_pTabModel->setRecord(i, aRec);    }    if (m_pTabModel->submitAll())        QMessageBox::information(this, "消息", "涨工资计算完毕", QMessageBox::Ok, QMessageBox::NoButton);}//字段列表void QGuiSql::actFields_triggered(){    QSqlRecord  emptyRec = m_pTabModel->record();//获取空记录,只有字段名    if (emptyRec.count() > 0)    {        QString  str;        for (int i = 0; i < emptyRec.count(); i++)            str = str + emptyRec.fieldName(i) + '\n';        QMessageBox::information(this, "所有字段名", str, QMessageBox::Ok, QMessageBox::NoButton);    }}//保存void QGuiSql::actSubmit_triggered(){    bool res = m_pTabModel->submitAll();    if (!res)        QMessageBox::information(this, "消息", "数据保存错误,错误信息\n" + m_pTabModel->lastError().text(),            QMessageBox::Ok, QMessageBox::NoButton);    else    {        ui.actSubmit->setEnabled(false);        ui.actRevert->setEnabled(false);    }}//取消void QGuiSql::actRevert_triggered(){    m_pTabModel->revertAll();    ui.actSubmit->setEnabled(false);    ui.actRevert->setEnabled(false);}//升序void QGuiSql::radioBtnAscend_clicked(){    //queryModel = new QSqlQueryModel(this);    //proxyModel = new QSortFilterProxyModel(this);    //queryModel->setQuery(sql);    //proxyModel->setSourceModel(queryModel);    //tableView->setModel(proxyModel);    m_pTabModel->setSort(ui.comboFields->currentIndex(), Qt::AscendingOrder);    m_pTabModel->select();}//降序void QGuiSql::radioBtnDescend_clicked(){    m_pTabModel->setSort(ui.comboFields->currentIndex(), Qt::DescendingOrder);    m_pTabModel->select();}//男过滤void QGuiSql::radioBtnMan_clicked(){    m_pTabModel->setFilter(" Gender='男' ");}//女过滤void QGuiSql::radioBtnWoman_clicked(){    m_pTabModel->setFilter(" Gender='女' ");}//男女过滤void QGuiSql::radioBtnBoth_clicked(){    m_pTabModel->setFilter("");}void QGuiSql::comboFields_currentIndexChanged(int index){    if (ui.radioBtnAscend->isChecked())        m_pTabModel->setSort(index, Qt::AscendingOrder);    else        m_pTabModel->setSort(index, Qt::DescendingOrder);    m_pTabModel->select();}

代理类

#pragma once#include class QComboBoxDelegate : public QItemDelegate{    Q_OBJECTpublic:    QComboBoxDelegate(QObject* parent = 0);    ~QComboBoxDelegate();    void    setItems(QStringList items, bool isEdit);//初始化设置列表内容,是否可编辑    //自定义代理组件必须继承以下4个函数    QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option,        const QModelIndex& index) const Q_DECL_OVERRIDE;    void setEditorData(QWidget* editor, const QModelIndex& index) const Q_DECL_OVERRIDE;    void setModelData(QWidget* editor, QAbstractItemModel* model,        const QModelIndex& index) const Q_DECL_OVERRIDE;    void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option,        const QModelIndex& index) const Q_DECL_OVERRIDE;private:    QStringList m_ItemList;//选择列表    bool    m_isEdit; //是否可编辑};#include "QComboBoxDelegate.h"#include QComboBoxDelegate::QComboBoxDelegate(QObject *parent)    : QItemDelegate(parent){}QComboBoxDelegate::~QComboBoxDelegate(){}void QComboBoxDelegate::setItems(QStringList items, bool isEdit){    m_ItemList = items;    m_isEdit = isEdit;}QWidget* QComboBoxDelegate::createEditor(QWidget* parent,    const QStyleOptionViewItem& option, const QModelIndex& index) const{    //QComboBox* editor = new QComboBox(parent);    //editor->addItem("优");    //editor->addItem("良");    //editor->addItem("一般");    //editor->addItem("不合格");    Q_UNUSED(option);    Q_UNUSED(index);    QComboBox* editor = new QComboBox(parent);    for (int i = 0; i < m_ItemList.count(); i++)   //从字符串列表初始下拉列表        editor->addItem(m_ItemList.at(i));    editor->setEditable(m_isEdit); //是否可编辑    return editor;}void QComboBoxDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const{    QString str = index.model()->data(index, Qt::EditRole).toString();    QComboBox* comboBox = static_cast(editor);    comboBox->setCurrentText(str);}void QComboBoxDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const{    QComboBox* comboBox = static_cast(editor);    QString str = comboBox->currentText();    model->setData(index, str, Qt::EditRole);}void QComboBoxDelegate::updateEditorGeometry(QWidget* editor,    const QStyleOptionViewItem& option, const QModelIndex& index) const{    editor->setGeometry(option.rect);}

qt qtableview插入进度条_Qt之QSqlTableModel的使用相关推荐

  1. qt 进度条_Qt开源作品12-硬盘容量控件

    一.前言 磁盘容量统计控件,说白了,就是用来统计本地盘符占用的容量,包括但不限于已用空间.剩余空间.总大小.已用百分比等,其中对应的百分比采用进度条显示,该进度条的前景色和背景色及文字颜色可以设置,在 ...

  2. QT自定义圆形进度条

    以下是一个简单的示例,展示如何创建一个自定义的圆形进度条控件. 1.创建一个新的Qt控件类,继承QProgressBar类.在该类的头文件中添加以下代码:     class CircularProg ...

  3. GDAL算法进度条使用说明

    在调用GDAL算法的时候,希望能够显示其处理进度信息,其实在GDAL的算法API中,一般最后两个参数就是进度信息的指针.下面分别实现两种进度条信息,一种是在控制台中的进度条,一种是基于QT界面的进度条 ...

  4. delphi fmx 跨平台水波进度条

    在网上经常看到js,qt的水波进度条, 于是想fmx应该也可以实现的, 于是从qt翻译过来一个水波进度条 如下图 我没封装成控件,动态创建就好了, 对于球形的水波进度,我没处理好,路径搞不出来 代码如 ...

  5. qt 进度条最小_QT:圆形进度条设计

    QT版本:win32 QT Creator5.9.9 在QT中只有横条状的进度条,目前需要使用圆形状进度条显示进度,只能自己设计一个,可以显示圆弧.圆圈和中心文本. 设计思路: ①设计一个QWidge ...

  6. 更新QTableView中的进度条状态

    前段时间,我接触了,如何在一个QTableView中加入一个控件,类似于QCheckBox QProgressBar,QLineEdit等. 最近在项目中实际运用,才发现,在Qt中自定义委托,如果插入 ...

  7. 在状态栏中插入类似进度条的可视控件

    首先,在Form中放置一个状态条控件Status.调节Status.Panels,在其中插入3个状态条嵌板.第二个嵌板的参数Style设置成psOwnerDraw.这一点很重要,如果没有这样做,将永远 ...

  8. QT 定时关机、共享内存、启动浏览器、浏览器前进后退刷新、进度条、设置浏览器标题、QML入门

    定时关机 .h #include <QTimer> #include <stdlib.h> #include <QByteArray>//构造函数 //system ...

  9. Qt创建任务栏进度条

    一.正文 任务栏进度条是Windows7就引入的一种UI形式,通常用于显示软件当前正在执行的任务的进度(如编译程序的进度.下载任务的进度).如下: 在Qt中使用任务栏进度条也是非常容易的一件事情.Qt ...

  10. 【OpenCV+Qt】实现简易视频播放器——支持进度条拖动

    OpenCV实现视频播放器,其思路大致就是在线程中使用OpenCV中的VideoCapture循环读取本地视频的每一帧Mat,然后发送到界面转换成QImage进行显示,而进度条拖动则用到了VideoC ...

最新文章

  1. 数字图像处理1:基本概念
  2. 对于数组,为什么会出现a [5] == 5 [a]?
  3. 3d布料系统横向飘动_重磅首发!ZB 2021自带布料运算,独家中文字幕!妈妈再不担心我通宵改衣褶了...
  4. c++ 数组引用_在 Solidity中使用值数组以降低 gas 消耗
  5. bigquery 教程_bigquery挑战实验室教程从数据中获取见解
  6. 如何把meshlab中的圆环去掉_MeshLab中配准点云
  7. linux应用程序原理,LINUX原理及应用:第15章 XWindow及Genie应用程序
  8. python读取与写入配置文件
  9. php jq表格,如何用jQuery操作表单和表格
  10. ionic 富文本编辑样式后,前台不能回显样式
  11. 计算机图形学完整笔记(五):二维图形变换
  12. bos 文件上传-调研
  13. 十三、商城 - 商城架构-分布式Dubbo(1)
  14. 寒假11:寂寞的数、连续正整数的和、学做菜
  15. “修真院”修行九九八十一难(1)
  16. JVM--插入式注解处理器
  17. 《大学“电路分析基础”课程实验合集.实验四》丨线性电路特性的研究
  18. 二进制部署高可用k8s集群
  19. 微信朋友圈营销如何做好头像_昵称_签名_背景基础设置?
  20. STM32F105 实现USB BULK传输

热门文章

  1. 算法笔记_面试题_12.二叉搜索树的最近公共祖先
  2. OpenCV_mechanisms of Canny operator(Canny算子检测图像边缘)
  3. 递归算法—输入字母逆序输出汉诺塔递归算法
  4. C++_class Template about Stack(使用类模板实现栈操作)
  5. opencv图像分析与处理(9)- 选择性滤波
  6. 机器学习课程笔记【十三】- 独立成分分析
  7. 度量两个概率分布差异性/距离的指标总结_KL 散度(相对熵)交叉熵 JS散度 Wasserstein-1距离 Earth-Mover (EM)distance
  8. 2021 CVPR | 基于渐进感受局部区域推理的全方位监督点云分割
  9. PCL中把txt文件转换成.pcd文件(很简单)
  10. 【考试记录】20181003