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

上海美容网站建设asp.net 网站开发的技术优势

上海美容网站建设,asp.net 网站开发的技术优势,aso优化渠道,软件开发工程师培训学校文章目录 一、QSqlTableModel 的使用1.主窗口MainWindow类定义2.构造函数3.打开数据表3.1 添加 SQLite 数据库驱动、设置数据库名称、打开数据库3.2 数据模型设置、选择模型、自定义代理组件、界面组件与模型数据字段间的数据映射 4.添加、插入与删除记录5.保存与取消修改6.设置… 文章目录 一、QSqlTableModel 的使用1.主窗口MainWindow类定义2.构造函数3.打开数据表3.1 添加 SQLite 数据库驱动、设置数据库名称、打开数据库3.2 数据模型设置、选择模型、自定义代理组件、界面组件与模型数据字段间的数据映射 4.添加、插入与删除记录5.保存与取消修改6.设置和清除照片7.数据记录的遍历8.记录排序9.记录过滤 关于QSqlDatabase、QSqlTableModel、QSqlRecord、QDataWidgetMapper 类的使用可参考Qt基础 | Qt SQL模块介绍 | Qt SQL模块常用类及其常用函数介绍 一、QSqlTableModel 的使用 这一部分使用 QSqlTableModel 显示实例数据库 demodb 中 employee 数据表的内容实现编辑、插入、删除记录的操作实现数据的排序和记录过滤还实现 BLOB 类型字段 Photo 中存储照片的显示、导入等操作。 1.主窗口MainWindow类定义 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include QMainWindow#include QLabel #include QString#include QtSql #include QDataWidgetMapper#include qwcomboboxdelegate.hnamespace Ui { class MainWindow; }class MainWindow : public QMainWindow {Q_OBJECTprivate:QSqlDatabase DB;//数据库连接QSqlTableModel *tabModel; //数据模型QItemSelectionModel *theSelection; //选择模型QDataWidgetMapper *dataMapper; //数据映射QWComboBoxDelegate delegateSex; //自定义数据代理性别QWComboBoxDelegate delegateDepart; //自定义数据代理部门void openTable();//打开数据表void getFieldNames();//获取字段名称,填充“排序字段”的comboBox public:explicit MainWindow(QWidget *parent 0);~MainWindow();private slots:void on_currentChanged(const QModelIndex current, const QModelIndex previous);// QTableView的SelectionModel的行发生了变化进行处理void on_currentRowChanged(const QModelIndex current, const QModelIndex previous);void on_actOpenDB_triggered();void on_actRecAppend_triggered();void on_actRecInsert_triggered();void on_actRevert_triggered();void on_actSubmit_triggered();void on_actRecDelete_triggered();void on_actPhoto_triggered();void on_actPhotoClear_triggered();void on_radioBtnAscend_clicked();void on_radioBtnDescend_clicked();void on_radioBtnMan_clicked();void on_radioBtnWoman_clicked();void on_radioBtnBoth_clicked();void on_comboFields_currentIndexChanged(int index);void on_actScan_triggered(); private:Ui::MainWindow *ui; };#endif // MAINWINDOW_HMainWindow 类中定义了几个私有变量 QSqlDatabase DB用于加载数据库驱动和建立与数据库之间的连接 QSqlTableModel *tabModel用于指定某个数据表 作为数据表的数据模型 QItemSelectionModel *theSelection作为 tabModel 的选择模型提供 currentChanged()、currentRowChanged()信号在 tabModel 选择的字段发生变化、当前记录发生变化时发射信号以便程序进行响应。 例如在 currentChanged() 信号发射时检查 tabModel 是否有数据被修改 从而更新界面上 “保存”和“取消“两个按钮的使能状态 QDataWidgetMapper *dataMapper用于实现界面组件与 tabModel 的字段之间的映射。 例如界面上的 QLineEdit 型的 dbEditName 组件与数据表的 Name 字段映射当前记录变化时会自动更新显示当前记录 Name 段的数据。 QWComboBoxDelegate delegateSex是自定义的基于 QComboBox 的代理类delegateSex 和 delegateDepart 用作 tableView 中“性别” 和 “部门” 字段的代理组件。 私有函数 openTable函数用于打开数据表包括添加 SQLite 数据库驱动、打开数据库文件、连接 employee 数据表并设置显示属性并创建 tableView 显示的代理组件设置数据源与界面组件的映射等getFieldNames函数用于获取数据表 employee 的所有字段的名称并填充界面上 “排序字段” 后的 ComboBox 组件。 槽函数 on_currentChanged用于检查数据表内容是否修改根据是否有未提交的修改更新工具栏按钮 “保存” 和 “取消” 两个按钮的使能状态。on_currentRowChanged用于在当前行变化时从新的记录里提取 Photo 字段的内容并将图片在 QLabel 组件里显示出来。 2.构造函数 MainWindow 的构造函数代码如下主要是对 tableView 一些显示属性的设置。 MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {ui-setupUi(this);this-setCentralWidget(ui-splitter);// tableView显示属性设置ui-tableView-setSelectionBehavior(QAbstractItemView::SelectItems);ui-tableView-setSelectionMode(QAbstractItemView::SingleSelection);ui-tableView-setAlternatingRowColors(true); // ui-tableView-resizeColumnsToContents(); // ui-tableView-horizontalHeader()-setStretchLastSection(true); }setSelectionBehavior函数用于定义视图(View)选择哪种选择行为 void setSelectionBehavior(QAbstractItemView::SelectionBehavior behavior)QAbstractItemView::SelectionBehavior是一个枚举类型有如下选择 QAbstractItemView::SelectItems选择单个项QAbstractItemView::SelectRows仅选择行QAbstractItemView::SelectColumns仅选择列 setSelectionMode函数用于定义视图view的选择模式 void setSelectionMode(QAbstractItemView::SelectionMode mode)QAbstractItemView::SelectionMode是一个枚举类型有如下取值 QAbstractItemView::SingleSelection单选模式用户只能选择一个项目。QAbstractItemView::ContiguousSelection连续选择模式用户可以选择多个项目但这些项目必须在视觉上是连续的。QAbstractItemView::ExtendedSelection扩展选择模式用户可以选择多个项目并且可以选择非连续的项目。QAbstractItemView::MultiSelection多选模式用户可以选择多个项目。QAbstractItemView::NoSelection无选择模式 setAlternatingRowColors函数用来控制当前是否启用交替行颜色绘制背景 void setAlternatingRowColors(bool enable)当 alternatingRowColors 属性设置为 true 时视图中的项背景将使用 QPalette::Base 和 QPalette::AlternateBase 颜色交替绘制。QPalette::Base 是默认的背景颜色而 QPalette::AlternateBase 是用于交替行的背景颜色。 当 alternatingRowColors 属性设置为 false 时所有项的背景将统一使用 QPalette::Base 颜色绘制。 resizeColumnsToContents函数用于根据列中每个项的代理组件的大小提示来调整所有列的宽度 void QTableView::resizeColumnsToContents()horizontalHeader函数用于返回 QTableView 的水平表头 QHeaderView *QTableView::horizontalHeader() const3.打开数据表 打开数据表这一部分主要包括 添加 SQLite 数据库驱动、设置数据库名称、打开数据库设置数据模型、选择模型、自定义代理组件、界面组件与模型数据字段间的数据映射 3.1 添加 SQLite 数据库驱动、设置数据库名称、打开数据库 这一部分主要用到了 QSqlDatabase 类该类用于处理与数据库的连接。 void MainWindow::on_actOpenDB_triggered() {//打开数据表QString aFileQFileDialog::getOpenFileName(this,选择数据库文件,,SQL Lite数据库(*.db *.db3));if (aFile.isEmpty()) //选择SQL Lite数据库文件return;//打开数据库DBQSqlDatabase::addDatabase(QSQLITE); //添加 SQL LITE数据库驱动DB.setDatabaseName(aFile); //设置数据库名称 // DB.setHostName(); // DB.setUserName(); // DB.setPassword();if (!DB.open()) //打开数据库{QMessageBox::warning(this, 错误, 打开数据库失败,QMessageBox::Ok,QMessageBox::NoButton);return;}//打开数据表openTable(); }补充 QSqlDatabase::addDatabase该静态函数用于添加数据库驱动其返回结果为 QSqlDatabase 类该类可用于数据库操作包括建立数据库连接设置登陆数据库的参数打开数据库等。 其完整的函数声明如下 [static] QSqlDatabase QSqlDatabase::addDatabase(const QString type, const QString connectionName QLatin1String(defaultConnection))示例 // 添加一个名为 myConnection 的 SQLite 数据库连接 QSqlDatabase db QSqlDatabase::addDatabase(QSQLITE, myConnection); db.setDatabaseName(example.db); // 设置数据库文件名 db.setUserName(user); // 设置用户名 db.setPassword(password); // 设置密码// 打开数据库连接 if (db.open()) {QSqlQuery query;query.exec(SELECT * FROM table_name); // 执行查询while (query.next()) {// 处理查询结果}db.close(); } else {qDebug() Error: Unable to open database; }还有一个函数重载参数指定的不是驱动名称而是 QSqlDriver 类。 [static] QSqlDatabase QSqlDatabase::addDatabase(QSqlDriver *driver, const QString connectionName QLatin1String(defaultConnection))示例 PGconn *con PQconnectdb(hostserver userbart passwordsimpson dbnamespringfield); QPSQLDriver *drv new QPSQLDriver(con); QSqlDatabase db QSqlDatabase::addDatabase(drv); // becomes the new default connection QSqlQuery query; query.exec(SELECT NAME, ID FROM STAFF);QSqlDatabase类的数据库连接操作用于设置数据库连接与登陆参数 注意对于 SQLite 数据库只需用 setDatabaseName() 设置数据库文件即可。如果是网络型数据库如 Oracle、MS SQL Server等还需要使用 setHostName() 设置主机名setUserName() 设置数据库用户名setPassword() 设置数据库登陆密码。 setDatabaseName设置数据库名称setHostName设置数据库主机名setUserName设置数据库用户名setPassword设置数据库登陆密码 open()函数打开数据库。如果成功打开数据库则返回true 3.2 数据模型设置、选择模型、自定义代理组件、界面组件与模型数据字段间的数据映射 这部分用到 3 个类 QSqlTableModel QSqlTableModel 是一个用于显示和编辑单个数据库表内容的模型 QTableView 二维数据表视图组件有多个行和多个列每个基本显示单元是一个单元格通过 setModel() 函数设置一个 QSqlTableModel 类的数据模型之后一个单元格显示 QSqlTableModel 数据模型中的一个项 QItemSelectionModel 一个用于跟踪视图组件的单元格选择状态的类当在 QTableView 选择某个单元格或多个单元格时通过 QItemSelectionModel 可以获得选中的单元格的模型索引为单元格的选择操作提供方便。 这几个类之间的关系是QTableView是界面视图组件其关联的数据模型是 QSqlTableModel关联的项选择模型是 QItemSelectionModel。 数据模型创建与属性设置 tabModelnew QSqlTableModel(this,DB);//数据表 tabModel-setTable(employee); //设置数据表 tabModel-setEditStrategy(QSqlTableModel::OnManualSubmit);//数据保存方式OnManualSubmit , OnRowChange tabModel-setSort(tabModel-fieldIndex(empNo),Qt::AscendingOrder); //排序 if (!(tabModel-select()))//查询数据 {QMessageBox::critical(this, 错误信息,打开数据表错误,错误信息\ntabModel-lastError().text(),QMessageBox::Ok,QMessageBox::NoButton);return; }创建数据库模型且指定数据库的连接 通过往 QSqlTableModel 构造函数中传入参数来指定数据库连接 构造函数为 QSqlTableModel::QSqlTableModel(QObject *parent nullptr, QSqlDatabase db QSqlDatabase())在本案例中为 tabModelnew QSqlTableModel(this,DB);//数据表使用 setTable() 函数来指定数据表此时不会立即读取记录但会提取字段信息 [virtual] void QSqlTableModel::setTable(const QString tableName)在本案例中为 tabModel-setTable(employee); //设置数据表使用 setSort() 函数设置排序字段与排序规则需调用 select() 函数才生效 [virtual] void QSqlTableModel::setSort(int column, Qt::SortOrder order)第一个参数 column 是排序字段的列号第二个参数 order 是枚举类型Qt::SortOrder表示排序方式其中Qt::AscendingOrder表示升序Qt::DescendingOrder表示降序 在本案例中为 tabModel-setSort(tabModel-fieldIndex(empNo),Qt::AscendingOrder); //排序使用 setEditStrategy() 函数用于设置编辑策略 [virtual] void QSqlTableModel::setEditStrategy(QSqlTableModel::EditStrategy strategy)参数 strategy 是枚举类型 QSqlTableModel::EditStrategy各取值的意义如下 QSqlTableModel::OnFieldChange字段值变化时立即更新到数据库QSqlTableModel::OnRowChange当前行记录变换时更新到数据库QSqlTableModel::OnManualSubmit所有修改暂时缓存手动调用 submitAll() 保存所有修改或调用 revertAll() 函数取消所有未保存的修改。 使用 select() 函数查询数据表的数据并使用设置的排序和过滤规则 [virtual slot] bool QSqlTableModel::select()如果成功打开则返回true否则返回false 在本案例中为 tabModel-select()表头设置 使用 setHeaderData() 函数设置表头即设置数据库表的字段在 tableView 中显示时的字段名称。为此将每个字段的显示设置为相应的中文标题。 [override virtual] bool QSqlQueryModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant value, int role Qt::EditRole)参数 section 是字段的序号通过 fieldIndex() 函数可以获取某个字段名在数据模型里的序号参数 orientation 是字段的方向其中Qt::Horizontal表示是水平方向标题Qt::Vertical表示是竖直方向标题参数 value 是要设置的值 表头设置部分代码为 tabModel-setHeaderData(tabModel-fieldIndex(empNo),Qt::Horizontal,工号);tabModel-setHeaderData(tabModel-fieldIndex(Name),Qt::Horizontal,姓名);tabModel-setHeaderData(tabModel-fieldIndex(Gender),Qt::Horizontal,性别);tabModel-setHeaderData(tabModel-fieldIndex(Height),Qt::Horizontal,身高);tabModel-setHeaderData(tabModel-fieldIndex(Birthday),Qt::Horizontal,出生日期);tabModel-setHeaderData(tabModel-fieldIndex(Mobile),Qt::Horizontal,手机);tabModel-setHeaderData(tabModel-fieldIndex(Province),Qt::Horizontal,省份);tabModel-setHeaderData(tabModel-fieldIndex(City),Qt::Horizontal,城市);tabModel-setHeaderData(tabModel-fieldIndex(Department),Qt::Horizontal,部门);tabModel-setHeaderData(tabModel-fieldIndex(Education),Qt::Horizontal,学历);tabModel-setHeaderData(tabModel-fieldIndex(Salary),Qt::Horizontal,工资);tabModel-setHeaderData(tabModel-fieldIndex(Memo),Qt::Horizontal,备注); //这两个字段不再tableView中显示tabModel-setHeaderData(tabModel-fieldIndex(Photo),Qt::Horizontal,照片);创建选择模型及信号的作用 选择模型的作用是当用户在 TableView 组件上操作时获取当前选择的行 、列信息并且在选择的单元格变化时发射 currentChanged() 信号在当前行变化时发射 currentRowChanged() 信号。 theSelectionnew QItemSelectionModel(tabModel);//关联选择模型 //theSelection当前项变化时触发currentChanged信号 connect(theSelection,SIGNAL(currentChanged(QModelIndex,QModelIndex)),this,SLOT(on_currentChanged(QModelIndex,QModelIndex))); //选择行变化时 connect(theSelection,SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),this,SLOT(on_currentRowChanged(QModelIndex,QModelIndex)));对应的槽函数为 void MainWindow::on_currentChanged(const QModelIndex current, const QModelIndex previous) {//更新actPost和actCancel 的状态Q_UNUSED(current);Q_UNUSED(previous);ui-actSubmit-setEnabled(tabModel-isDirty()); //有未保存修改时可用ui-actRevert-setEnabled(tabModel-isDirty()); }void MainWindow::on_currentRowChanged(const QModelIndex current, const QModelIndex previous) {Q_UNUSED(previous); // 行切换时的状态控制ui-actRecDelete-setEnabled(current.isValid());ui-actPhoto-setEnabled(current.isValid());ui-actPhotoClear-setEnabled(current.isValid());if (!current.isValid()){ui-dbLabPhoto-clear(); //清除图片显示return;}dataMapper-setCurrentIndex(current.row()); //更新数据映射到当前行使界面上的编辑框、下拉列表框等与字段关联的界面组件显示当前记录的内容int curRecNocurrent.row();//获取行号QSqlRecord curRectabModel-record(curRecNo); //获取当前记录if (curRec.isNull(Photo)) //图片字段内容为空ui-dbLabPhoto-clear();else{QByteArray datacurRec.value(Photo).toByteArray();QPixmap pic;pic.loadFromData(data);ui-dbLabPhoto-setPixmap(pic.scaledToWidth(ui-dbLabPhoto-size().width()));} }tableView的设置 用 QTableView 组件显示 tabModel 的表格数据内容时需要设置其数据模型和关联选择模型并且将 “Memo” 和 “Photo” 两个字段的列设置为隐藏因为在表格里难以显示备注文件和图片。 ui-tableView-setModel(tabModel);//设置数据模型 ui-tableView-setSelectionModel(theSelection); //设置选择模型 ui-tableView-setColumnHidden(tabModel-fieldIndex(Memo),true);//隐藏列 ui-tableView-setColumnHidden(tabModel-fieldIndex(Photo),true);//隐藏列自定义基于 QComboBox 的代理组件类 QWComboBoxDelegate组件类中有一个函数 setItems() 用于初始化下拉列表框和设置是都可以编辑 qwcombocoxdelegate.h #ifndef QWCOMBOBOXDELEGATE_H #define QWCOMBOBOXDELEGATE_H#include QStyledItemDelegate #include QComboBoxclass QWComboBoxDelegate : public QStyledItemDelegate {Q_OBJECTprivate:QStringList m_ItemList;//选择列表bool m_isEdit; //是否可编辑public:QWComboBoxDelegate(QObject *parent0);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; };#endif // QWCOMBOBOXDELEGATE_Hqwcombocoxdelegate.cpp #include qwcomboboxdelegate.h#include QComboBoxQWComboBoxDelegate::QWComboBoxDelegate(QObject *parent):QStyledItemDelegate(parent) {}void QWComboBoxDelegate::setItems(QStringList items, bool isEdit) {m_ItemListitems;m_isEditisEdit; }QWidget *QWComboBoxDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem option, const QModelIndex index) const {Q_UNUSED(option);Q_UNUSED(index);QComboBox *editor new QComboBox(parent);for (int i0;im_ItemList.count();i) //从字符串列表初始下拉列表editor-addItem(m_ItemList.at(i));editor-setEditable(m_isEdit); //是否可编辑return editor; }void QWComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex index) const {QString str index.model()-data(index, Qt::EditRole).toString();QComboBox *comboBox static_castQComboBox*(editor);comboBox-setCurrentText(str); }void QWComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex index) const {QComboBox *comboBox static_castQComboBox*(editor);QString str comboBox-currentText();model-setData(index, str, Qt::EditRole); }void QWComboBoxDelegate::updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem option, const QModelIndex index) const {Q_UNUSED(index);editor-setGeometry(option.rect); }创建多个代理组件实例分别用于“性别” 和 “部门” 两个字段。 //tableView上为“性别”和“部门”两个字段设置自定义代理组件 QStringList strList; strList男女; bool isEditablefalse; delegateSex.setItems(strList,isEditable); ui-tableView-setItemDelegateForColumn(tabModel-fieldIndex(Gender),delegateSex); //Combbox选择型strList.clear(); strList销售部技术部生产部行政部; isEditabletrue; delegateDepart.setItems(strList,isEditable); ui-tableView-setItemDelegateForColumn(tabModel-fieldIndex(Department),delegateDepart); //Combbox选择型数据映射 QDataWidgetMapper 用于建立界面组件与数据模型之间的映射可以将界面的 QLineEdit、QCombobox 等组件与数据模型的一个字段关联起来。当数据模型关联的字段内容发生变化时自动更新组件的显示内容。 //创建界面组件与数据模型的字段之间的数据映射 dataMapper new QDataWidgetMapper(); dataMapper-setModel(tabModel);//设置数据模型 dataMapper-setSubmitPolicy(QDataWidgetMapper::AutoSubmit);//// dataMapper-setItemDelegate(new QSqlRelationalDelegate(this)); //含有外键的 //界面组件与tabModel的具体字段之间的联系 dataMapper-addMapping(ui-dbSpinEmpNo,tabModel-fieldIndex(empNo)); dataMapper-addMapping(ui-dbEditName,tabModel-fieldIndex(Name)); dataMapper-addMapping(ui-dbComboSex,tabModel-fieldIndex(Gender));dataMapper-addMapping(ui-dbSpinHeight,tabModel-fieldIndex(Height)); dataMapper-addMapping(ui-dbEditBirth,tabModel-fieldIndex(Birthday)); dataMapper-addMapping(ui-dbEditMobile,tabModel-fieldIndex(Mobile));dataMapper-addMapping(ui-dbComboProvince,tabModel-fieldIndex(Province)); dataMapper-addMapping(ui-dbEditCity,tabModel-fieldIndex(City)); dataMapper-addMapping(ui-dbComboDep,tabModel-fieldIndex(Department));dataMapper-addMapping(ui-dbComboEdu,tabModel-fieldIndex(Education)); dataMapper-addMapping(ui-dbSpinSalary,tabModel-fieldIndex(Salary));dataMapper-addMapping(ui-dbEditMemo,tabModel-fieldIndex(Memo));// dataMapper-addMapping(ui-dbPhoto,tabModel-fieldIndex(Photo)); //图片无法直接映射dataMapper-toFirst();//移动到首记录getFieldNames();//获取字段名称列表填充ui-groupBoxSort组件//更新actions和界面组件的使能状态 ui-actOpenDB-setEnabled(false);ui-actRecAppend-setEnabled(true); ui-actRecInsert-setEnabled(true); ui-actRecDelete-setEnabled(true); ui-actScan-setEnabled(true);ui-groupBoxSort-setEnabled(true); ui-groupBoxFilter-setEnabled(true);setModel() 函数–设置关联的数据模型 void QDataWidgetMapper::setModel(QAbstractItemModel *model)用于设置 QDataWidgetMapper 将要使用的数据模型。参数 model 是一个指向 QAbstractItemModel 类型的指针 setSubmitPolicy() 函数–设置数据提交策略 void setSubmitPolicy(QDataWidgetMapper::SubmitPolicy policy)其参数policy是一个枚举类型QDataWidgetMapper::SubmitPolicy。取值如下 QDataWidgetMapper::AutoSubmit自动行切换时将自动提交修改。QDataWidgetMapper::ManualSubmit手动需调用 submit() 方法手工提交当前记录的修改。 addMapping() 函数 – 用于设置界面组件与数据模型的列的映射这种映射关系使得控件的值可以与数据模型中的特定项关联起来 void QDataWidgetMapper::addMapping(QWidget *widget, int section)参数 widget 是指向 UI 控件的指针section 指定了数据模型中的列如果方向是水平的或行如果方向是垂直的 setCurrentIndex() 函数 – 将当前行数据映射到界面组件 使界面上的编辑框、下拉列表框等与字段关联的界面组件显示当前记录的内容 virtual void setCurrentIndex(int index)例如 dataMapper-setCurrentIndex(current.row()); //更新当前行数据映射setCurrentModelIndex() 函数–当用户在视图中选择不同的行或列时自动更新与之关联的表单或控件的数据。 [slot] void QDataWidgetMapper::setCurrentModelIndex(const QModelIndex index)revert() 和 submit() 函数用于手工取消或提交当前记录的修改。 toFirst()、toPrevious()、toNext() 和 toLast() 函数用于在记录间移动 如toFirst()函数用于移动到首记录 获取数据表的所有字段名称 使用不带参数的 record() 函数获取数据表的所有字段名称并填充到排序的下拉列表框中 void MainWindow::getFieldNames() { //获取所有字段名称QSqlRecord emptyRectabModel-record();//获取空记录只有字段名for (int i0;iemptyRec.count();i)ui-comboFields-addItem(emptyRec.fieldName(i)); }4.添加、插入与删除记录 使用 insertRow() 函数在数据模型的 row 行前面插入一行记录如果 row 大于或等于数据模型的总行数则在最后添加一行记录。最后选中刚插入的那一行记录。 void MainWindow::on_actRecAppend_triggered() {//添加记录tabModel-insertRow(tabModel-rowCount(),QModelIndex()); //在末尾添加一个记录QModelIndex curIndextabModel-index(tabModel-rowCount()-1,1);//创建最后一行的ModelIndextheSelection-clearSelection();//清空选择项theSelection-setCurrentIndex(curIndex,QItemSelectionModel::Select);//设置刚插入的行为当前选择行int currowcurIndex.row(); //获得当前行tabModel-setData(tabModel-index(currow,0),2000tabModel-rowCount()); //自动生成编号tabModel-setData(tabModel-index(currow,2),男); // 插入行时设置缺省值需要在primeInsert()信号里去处理 }void MainWindow::on_actRecInsert_triggered() {//插入记录QModelIndex curIndexui-tableView-currentIndex();tabModel-insertRow(curIndex.row(),QModelIndex());theSelection-clearSelection();//清除已有选择theSelection-setCurrentIndex(curIndex,QItemSelectionModel::Select); }使用 removeRow() 函数删除选中的那一行记录。 void MainWindow::on_actRecDelete_triggered() {//删除当前记录QModelIndex curIndextheSelection-currentIndex();//获取当前选择单元格的模型索引tabModel-removeRow(curIndex.row()); //删除最后一行 }在插入或删除记录操作未提交保存之前 tableView 的左侧表头会以标记表示记录编辑状态*表示新插入的记录”!” 表示删除的记录 。在保存或取消修改这些标记就消失删除的记录行也从 tableView 里删除。 5.保存与取消修改 在打开数据表初始化时设置数据模型的编辑策略为 OnManualSubmit即手动提交修改。当数据模型的数据被修改后不管是直接修改字段值还是插入或删除记录在未提交修改前QSqlTableModel::isDirty() 函数返回 true就是利用这个函数在槽函数 on_currentChanged() 里设置 ”保存修改“和”取消修改“ 按钮的使能状态。 使用 submitAll() 函数用于将数据表所有未提交的修改保存到数据库中使用 revertAll() 函数来取消所有修改。 void MainWindow::on_actRevert_triggered() {//取消修改tabModel-revertAll();ui-actSubmit-setEnabled(false);ui-actRevert-setEnabled(false); }void MainWindow::on_actSubmit_triggered() {//保存修改bool restabModel-submitAll();if (!res)QMessageBox::information(this, 消息, 数据保存错误,错误信息\ntabModel-lastError().text(),QMessageBox::Ok,QMessageBox::NoButton);else{ui-actSubmit-setEnabled(false);ui-actRevert-setEnabled(false);} }6.设置和清除照片 设置照片功能是用文件对话框选择一个图片文件读取文件内容到 QByteArray 类型的变量data里获取当前记录到变量 curRec 后用 QSqlRecord 的 setValue() 函数为 Photo 字段设置数据为 data然后用 setRecord() 函数更新当前记录的数据到数据模型并在界面组件上显示。 注意这里的更新只是更新到数据模型并没有更新到数据库。 void MainWindow::on_actPhoto_triggered() { //设置照片QString aFileQFileDialog::getOpenFileName(this,选择图片文件,,照片(*.jpg));if (aFile.isEmpty())return;QByteArray data;QFile* filenew QFile(aFile); //fileName为二进制数据文件名file-open(QIODevice::ReadOnly);data file-readAll();file-close();int curRecNotheSelection-currentIndex().row();QSqlRecord curRectabModel-record(curRecNo); //获取当前记录curRec.setValue(Photo,data); //设置字段数据tabModel-setRecord(curRecNo,curRec);QPixmap pic;pic.load(aFile); //在界面上显示ui-dbLabPhoto-setPixmap(pic.scaledToWidth(ui-dbLabPhoto-width())); }清楚照片的功能是获取当前记录到变量 curRec 后调用 setNull () 函数将 Photo 字段设置为 NULL就是清除了字段的内容然后更新记录到数据模型并清除界面组件的显示。 void MainWindow::on_actPhotoClear_triggered() {int curRecNotheSelection-currentIndex().row();QSqlRecord curRectabModel-record(curRecNo); //获取当前记录curRec.setNull(Photo);//设置为空值tabModel-setRecord(curRecNo,curRec);ui-dbLabPhoto-clear(); }7.数据记录的遍历 使用 record(int index) 函数获取每一行记录并对该行记录的值进行修改。 void MainWindow::on_actScan_triggered() {//涨工资记录遍历if (tabModel-rowCount()0)return;for (int i0;itabModel-rowCount();i){QSqlRecord aRectabModel-record(i); //获取当前记录float salaryaRec.value(Salary).toFloat();salarysalary*1.1;aRec.setValue(Salary,salary);tabModel-setRecord(i,aRec);}// 索引方式刷新记录,速度一样 // float salary; // for (int i0;itabModel-rowCount();i) // { // salarytabModel-data(tabModel-index(i,10)).toFloat(); // salarysalary*1.1; // tabModel-setData(tabModel-index(i,10),salary); // }if (tabModel-submitAll())QMessageBox::information(this, 消息, 涨工资计算完毕,QMessageBox::Ok,QMessageBox::NoButton); }8.记录排序 使用 setSort() 函数设置数据表根据某个字段按照升序或降序排列实际上就是设置 SQL 语句里的 ORDER BY 子句。在调用 setSort() 函数设置排序规则后需要调用 QSqITableModel::select() 重新读取数据表的数据才会使排序规则生效。 void MainWindow::on_comboFields_currentIndexChanged(int index) {//选择字段进行排序if (ui-radioBtnAscend-isChecked())tabModel-setSort(index,Qt::AscendingOrder);elsetabModel-setSort(index,Qt::DescendingOrder);tabModel-select(); }void MainWindow::on_radioBtnAscend_clicked() {//升序tabModel-setSort(ui-comboFields-currentIndex(),Qt::AscendingOrder);tabModel-select(); }void MainWindow::on_radioBtnDescend_clicked() {//降序tabModel-setSort(ui-comboFields-currentIndex(),Qt::DescendingOrder);tabModel-select(); }9.记录过滤 使用 setFilter() 函数设置记录的过滤条件实际上就是设置 SQL 语句里的 WHERE 子句。调用 setFilter() 后无需调用 select() 函数就可以立即刷新记录若要取消过滤条件只需在 setFilter() 函数里传递一个空字符串。 void MainWindow::on_radioBtnMan_clicked() {tabModel-setFilter( Gender男 ); // tabModel-select(); }void MainWindow::on_radioBtnWoman_clicked() {tabModel-setFilter( Gender女 ); // tabModel-select(); }void MainWindow::on_radioBtnBoth_clicked() {tabModel-setFilter(); }
http://www.w-s-a.com/news/998627/

相关文章:

  • 免费的开源网站wordpress建站不好用
  • 陕西建设厅人才网站ai生成logo免费
  • 建设家居网站村建站什么部门
  • 网站建设+青海龙岗区网站建设
  • 精品课网站建设网络公司名字怎么取
  • 化工网站制作用户体验设计案例
  • 如何在微信公众平台上建立微网站垂直门户网站怎么做
  • 关于销售网站有哪些内容品牌网站建设小科6a蚪
  • 免费制作网站平台哪个好湖南企业建网站
  • 灞桥微网站建设株洲百姓网
  • 儿童网站建设互联网怎么学
  • 重庆建网站的公司集中在哪里中煤第五建设有限公司网站
  • 成都网站建设987net运维需要掌握哪些知识
  • 网站建设师个人简介怎么写WordPress头像美化插件
  • 网站优化知识销售管理系统c语言
  • 桂林市网站设计厦门自己建网站
  • 网站seo哪里做的好东莞做网站优化的公司
  • 休闲采摘园网站建设政务公开和网站建设工作的建议
  • 长沙网站建设哪个公司好PHP amp MySQL网站建设宝典
  • 代码编辑器做热点什么网站好湛江网站建设哪家好
  • php网站开发概念网站开发岗位职责任职责格
  • asp 网站源码 下载西安自适应网站建设
  • 白领兼职做网站贵阳网站设计哪家好
  • 热水器网站建设 中企动力企业网站开发需要多钱
  • 北京市建设工程信息网交易网站静态网页模板免费下载网站
  • 福田欧曼服务站网站前台设计
  • 网站做系统叫什么软件吗注册域名需要实名认证吗
  • jsp网站开发教学视频ui设计风格
  • 注册网站建设开发怎么自己做导航网站
  • 设计做网站品牌咖啡主题网页界面设计