Qt提供了QSqlTableModel来将数据库以表格的形式显示在界面上。
示例代码:
//初始化
QSqlTableModel *model;
QTableView *view;
ColorDelegate colorDelegate;
model = new QSqlTableModel(this);
model->setTable("tableName");
view = new QTableView;
view->setModel(model);
view->setItemDelegateForColumn(3,&colorDelegate);//设置代理,弹出控件,比如颜色对话框
view->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
model->select();
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
//添加记录
QSqlRecord record = model->record();
int row = model->rowCount();
model->insertRecord(row,record);
//删除记录
QItemSelectionModel *selectModel = view->selectionModel();
QModelIndexList list = selectModel->selectedRows();
for(int i=0;i<list.size();i++){
model->removeRow(list.at(i).row());
}
//确定更改
model->submitAll();
//取消更改
model->revertAll();
model->submitAll();
//查询过滤
QString sql = "address = 'shanghai'";
model->setFilter(sql);
model->select();
如果针对某行或某列设置代理,使其选择数据弹出颜色对话框,日期对话框等自定义对话框选择数据,可以继承QItemDelegate子类化对象,并重写函数createEditor,setEditorData,setModelData,updateEditorGeometry。
示例代码:
//colordelegate.h
#include <QWidget>
#include <QItemDelegate>
#include <QModelIndex>
#include <QObject>
#include <QSize>
#include <QColorDialog>
class ColorDelegate : public QItemDelegate
{
Q_OBJECT
public:
QString text;
ColorDelegate(QObject *parent = 0);
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
void setEditorData(QWidget *editor, const QModelIndex &index) const;
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
//colordelegate.cpp
#include "colordelegate.h"
#include <QComboBox>
ColorDelegate::ColorDelegate(QObject *parent) : QItemDelegate(parent)
{
}
QWidget *ColorDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const{
QColorDialog *editor = new QColorDialog(parent);
editor->installEventFilter(const_cast<ColorDelegate*>(this));
return editor;
}
void ColorDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const{
QString value = index.model()->data(index,Qt::EditRole).toString();
QColorDialog *dialog = static_cast<QColorDialog*>(editor);
dialog->setCurrentColor(QColor(value));
}
void ColorDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const{
QColorDialog *dialog = static_cast<QColorDialog*>(editor);
QColor value = dialog->currentColor();
model->setData(index,value,Qt::EditRole);
}
void ColorDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const{
editor->setGeometry(option.rect);
}