QTableView和QSqlTableModel组合使用
SZ阿辉 2013-04-27 11:42:16 以下是我的代码:
这是mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QSqlTableModel>
#include<QDebug>
#include<QModelIndex>
#include<QItemSelectionModel>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_iRow=0;
m_iCol=0;
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("book");
if (!db.open())
{
qDebug()<<"fail";
}
else
{
initializeModel();
ui->tableView->setModel(model);
//ui->tableWidget->setModel(model);
}
SelectItemChanged(m_iRow,m_iCol);
}
MainWindow::~MainWindow()
{
delete model;
delete ui;
}
void MainWindow::keyPressEvent(QKeyEvent *k)
{
// QModelIndex index11= ui->tableView->model()->index(m_iRow, m_iCol, QModelIndex());
// QString str = ui->tableView->model()->itemData(index11).values()[0].toString();
qDebug()<<ui->tableView->currentIndex().row();
qDebug()<<m_iRow <<m_iCol;
switch(k->key())
{
case Qt::Key_Return:
{
model->database().transaction();
if (model->submitAll()) // 提交所有被修改的数据到数据库中
{
model->database().commit(); //提交成功,事务将真正修改数据库数据
}
else {
model->database().rollback(); //提交失败,事务回滚
}
// model->revertAll(); //撤销修改
// ui->tableView->setFocusPolicy(Qt::StrongFocus);
SelectItemChanged(m_iRow,m_iCol);
ui->tableView->edit(headModelIndex);
break;
}
case Qt::Key_Up:
{
if(m_iRow > 0)
m_iRow--;
else
m_iRow = model->rowCount() - 1;
SelectItemChanged(m_iRow,m_iCol);
break;
}
case Qt::Key_Down:
if(m_iRow < model->rowCount() - 1)
m_iRow++;
else
m_iRow = 0;
SelectItemChanged(m_iRow,m_iCol);
break;
case Qt::Key_Left:
if(m_iCol > 0)
m_iCol--;
else
m_iCol = 0;
SelectItemChanged(m_iRow,m_iCol);
break;
case Qt::Key_Right:
if(m_iCol >= 1)
m_iCol=0;
else
m_iCol++;
SelectItemChanged(m_iRow,m_iCol);
break;
default:
break;
}
}
void MainWindow::SelectItemChanged(int iRow, int iCol)
{
// QItemSelectionModel* selectionModel = ui->tableView->selectionModel();
headModelIndex = ui->tableView->model()->index(iRow, iCol);
// QModelIndex tailModelIndex = ui->tableView->model()->index(iRow, iCol);
// QItemSelection itemSelection(headModelIndex, tailModelIndex);
//selectionModel->select(itemSelection, QItemSelectionModel::SelectCurrent);
ui->tableView->setCurrentIndex(headModelIndex);
ui->tableView->scrollTo(headModelIndex);
}
void MainWindow::initializeModel()
{
model = new QSqlTableModel;
model->setTable("images");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();
model->setHeaderData(0, Qt::Horizontal, QObject::tr("locationid"));
model->setHeaderData(1, Qt::Horizontal, QObject::tr("file"));
}
这是mainwindow.h文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include<QKeyEvent>
#include<QSqlTableModel>
#include<QModelIndex>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
int m_iFileIndex;
int m_iRow;
int m_iCol;
QModelIndex headModelIndex;
QSqlDatabase db;
QSqlTableModel *model;
private:
void keyPressEvent(QKeyEvent *k);
void SelectItemChanged(int iRow, int iCol);
void initializeModel();
};
#endif // MAINWINDOW_H
用QTableView和QSqlTableModel组合,不用鼠标,按下回车键item可编辑 再按下回车item不能编辑 这个功能怎么实现,各位大神帮帮忙