📄 8.8 实例:数据库基本浏览.txt
字号:
#ifndef EDITABLESQLMODEL_H
#define EDITABLESQLMODEL_H
#include <QSqlQueryModel>
class EditableSqlModel : public QSqlQueryModel
{
Q_OBJECT
public:
EditableSqlModel(QObject *parent = 0);
Qt::ItemFlags flags(const QModelIndex &index) const;
bool setData(const QModelIndex &index, const QVariant &value, int role);
private:
bool setFirstName(int personId, const QString &firstName);
bool setLastName(int personId, const QString &lastName);
void refresh();
};
#endif
#include <QtSql>
#include "editablesqlmodel.h"
EditableSqlModel::EditableSqlModel(QObject *parent)
: QSqlQueryModel(parent)
{
}
Qt::ItemFlags EditableSqlModel::flags(
const QModelIndex &index) const
{
Qt::ItemFlags flags = QSqlQueryModel::flags(index);
if (index.column() == 1 || index.column() == 2)
flags |= Qt::ItemIsEditable;
return flags;
}
bool EditableSqlModel::setData(const QModelIndex &index, const QVariant &value, int
/* role */)
{
if (index.column() < 1 || index.column() > 2)
return false;
QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), 0);
int id = data(primaryKeyIndex).toInt();
clear();
bool ok;
if (index.column() == 1) {
ok = setFirstName(id, value.toString());
} else {
ok = setLastName(id, value.toString());
}
refresh();
return ok;
}
void EditableSqlModel::refresh()
{
setQuery("select * from person");
setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
setHeaderData(1, Qt::Horizontal, QObject::tr("First name"));
setHeaderData(2, Qt::Horizontal, QObject::tr("Last name"));
}
bool EditableSqlModel::setFirstName(int personId, const QString &firstName)
{
QSqlQuery query;
query.prepare("update person set firstname = ? where id = ?");
query.addBindValue(firstName);
query.addBindValue(personId);
return query.exec();
}
bool EditableSqlModel::setLastName(int personId, const QString &lastName)
{
QSqlQuery query;
query.prepare("update person set lastname = ? where id = ?");
query.addBindValue(lastName);
query.addBindValue(personId);
return query.exec();
}
#ifndef CUSTOMSQLMODEL_H
#define CUSTOMSQLMODEL_H
#include <QSqlQueryModel>
class CustomSqlModel : public QSqlQueryModel
{
Q_OBJECT
public:
CustomSqlModel(QObject *parent = 0);
QVariant data(const QModelIndex &item, int role) const;
};
#endif
#include <QtGui>
#include "customsqlmodel.h"
CustomSqlModel::CustomSqlModel(QObject *parent)
: QSqlQueryModel(parent)
{
}
QVariant CustomSqlModel::data(const QModelIndex &index, int role) const
{
QVariant value = QSqlQueryModel::data(index, role);
if (value.isValid() && role == Qt::DisplayRole) {
if (index.column() == 0)
return value.toString().prepend("#");
else if (index.column() == 2)
return value.toString().toUpper();
}
if (role == Qt::TextColorRole && index.column() == 1)
return qVariantFromValue(QColor(Qt::blue));
return value;
}
#include <QtGui>
#include "../connection.h"
#include "customsqlmodel.h"
#include "editablesqlmodel.h"
void initializeModel(QSqlQueryModel *model)
{
model->setQuery("select * from person");
model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
model->setHeaderData(1, Qt::Horizontal, QObject::tr("First name"));
model->setHeaderData(2, Qt::Horizontal, QObject::tr("Last name"));
}
void createView(const QString &title, QSqlQueryModel *model)
{
static int offset = 0;
QTableView *view = new QTableView;
view->setModel(model);
view->setWindowTitle(title);
view->move(100 + offset, 100 + offset);
offset += 20;
view->show();
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
if (!createConnection())
return 1;
QSqlQueryModel plainModel;
EditableSqlModel editableModel;
CustomSqlModel customModel;
initializeModel(&plainModel);
initializeModel(&editableModel);
initializeModel(&customModel);
createView(QObject::tr("Plain Query Model"), &plainModel);
createView(QObject::tr("Editable Query Model"), &editableModel);
createView(QObject::tr("Custom Query Model"), &customModel);
return app.exec();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -