qt qtableview插入进度条_Qt之QSqlTableModel的使用
点击上方“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的使用相关推荐
- qt 进度条_Qt开源作品12-硬盘容量控件
一.前言 磁盘容量统计控件,说白了,就是用来统计本地盘符占用的容量,包括但不限于已用空间.剩余空间.总大小.已用百分比等,其中对应的百分比采用进度条显示,该进度条的前景色和背景色及文字颜色可以设置,在 ...
- QT自定义圆形进度条
以下是一个简单的示例,展示如何创建一个自定义的圆形进度条控件. 1.创建一个新的Qt控件类,继承QProgressBar类.在该类的头文件中添加以下代码: class CircularProg ...
- GDAL算法进度条使用说明
在调用GDAL算法的时候,希望能够显示其处理进度信息,其实在GDAL的算法API中,一般最后两个参数就是进度信息的指针.下面分别实现两种进度条信息,一种是在控制台中的进度条,一种是基于QT界面的进度条 ...
- delphi fmx 跨平台水波进度条
在网上经常看到js,qt的水波进度条, 于是想fmx应该也可以实现的, 于是从qt翻译过来一个水波进度条 如下图 我没封装成控件,动态创建就好了, 对于球形的水波进度,我没处理好,路径搞不出来 代码如 ...
- qt 进度条最小_QT:圆形进度条设计
QT版本:win32 QT Creator5.9.9 在QT中只有横条状的进度条,目前需要使用圆形状进度条显示进度,只能自己设计一个,可以显示圆弧.圆圈和中心文本. 设计思路: ①设计一个QWidge ...
- 更新QTableView中的进度条状态
前段时间,我接触了,如何在一个QTableView中加入一个控件,类似于QCheckBox QProgressBar,QLineEdit等. 最近在项目中实际运用,才发现,在Qt中自定义委托,如果插入 ...
- 在状态栏中插入类似进度条的可视控件
首先,在Form中放置一个状态条控件Status.调节Status.Panels,在其中插入3个状态条嵌板.第二个嵌板的参数Style设置成psOwnerDraw.这一点很重要,如果没有这样做,将永远 ...
- QT 定时关机、共享内存、启动浏览器、浏览器前进后退刷新、进度条、设置浏览器标题、QML入门
定时关机 .h #include <QTimer> #include <stdlib.h> #include <QByteArray>//构造函数 //system ...
- Qt创建任务栏进度条
一.正文 任务栏进度条是Windows7就引入的一种UI形式,通常用于显示软件当前正在执行的任务的进度(如编译程序的进度.下载任务的进度).如下: 在Qt中使用任务栏进度条也是非常容易的一件事情.Qt ...
- 【OpenCV+Qt】实现简易视频播放器——支持进度条拖动
OpenCV实现视频播放器,其思路大致就是在线程中使用OpenCV中的VideoCapture循环读取本地视频的每一帧Mat,然后发送到界面转换成QImage进行显示,而进度条拖动则用到了VideoC ...
最新文章
- 数字图像处理1:基本概念
- 对于数组,为什么会出现a [5] == 5 [a]?
- 3d布料系统横向飘动_重磅首发!ZB 2021自带布料运算,独家中文字幕!妈妈再不担心我通宵改衣褶了...
- c++ 数组引用_在 Solidity中使用值数组以降低 gas 消耗
- bigquery 教程_bigquery挑战实验室教程从数据中获取见解
- 如何把meshlab中的圆环去掉_MeshLab中配准点云
- linux应用程序原理,LINUX原理及应用:第15章 XWindow及Genie应用程序
- python读取与写入配置文件
- php jq表格,如何用jQuery操作表单和表格
- ionic 富文本编辑样式后,前台不能回显样式
- 计算机图形学完整笔记(五):二维图形变换
- bos 文件上传-调研
- 十三、商城 - 商城架构-分布式Dubbo(1)
- 寒假11:寂寞的数、连续正整数的和、学做菜
- “修真院”修行九九八十一难(1)
- JVM--插入式注解处理器
- 《大学“电路分析基础”课程实验合集.实验四》丨线性电路特性的研究
- 二进制部署高可用k8s集群
- 微信朋友圈营销如何做好头像_昵称_签名_背景基础设置?
- STM32F105 实现USB BULK传输
热门文章
- 算法笔记_面试题_12.二叉搜索树的最近公共祖先
- OpenCV_mechanisms of Canny operator(Canny算子检测图像边缘)
- 递归算法—输入字母逆序输出汉诺塔递归算法
- C++_class Template about Stack(使用类模板实现栈操作)
- opencv图像分析与处理(9)- 选择性滤波
- 机器学习课程笔记【十三】- 独立成分分析
- 度量两个概率分布差异性/距离的指标总结_KL 散度(相对熵)交叉熵 JS散度 Wasserstein-1距离 Earth-Mover (EM)distance
- 2021 CVPR | 基于渐进感受局部区域推理的全方位监督点云分割
- PCL中把txt文件转换成.pcd文件(很简单)
- 【考试记录】20181003