Witam,
Moim celem bylo stworzenie prostego klienta SQLite, zachowujacego sie w ten sposob:
I. Po zmianie pola w tabeli zmiana w bazie danych (dziala).
II. W widoku zaznacza sie cale wiersze (dziala).
III. Prosty interfejs do wykonywania INSERT. (dziala)
IV. Mozna usuwac zaznaczone rekordy. (todo)
Na potrzeby IV do interfejsu dodalem QButton (ui->dropButton) i powiazalem go ze slotem drop_selected(). Teraz zalezy mi na implementacji odpowiedniej metody.
Zasadnicze pytanie: Jak to zrobic? Zrobilem research i znalazlem nastepujaca kontrolke:
Logika podpowiada, ze trzeba:
- Wybrac indeksy zaznaczonych elementow.
- Podac elementy usuwane do funkcji operujacej na modelu.
Metoda do wybierania zaznaczonych indeksów:
http://qt-project.org/doc/qt-4.8/qabstractitemview.html#selectedIndexes
Metoda usuwająca dane z modelu:
http://qt-project.org/doc/qt-4.8/qsqltablemodel.html#deleteRowFromTable
Nie jestem pewien czy to najptosza ścieżka, a nie mogę dokopać się do odpowiednich materiałów. Czy te metody to dobry wybór? Jesli nie, jak się za to zabrać?
// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtGui>
#include <QtSql>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
public slots:
private slots:
void addRecord();
void default_settings_db();
void drop_selected();
private:
Ui::MainWindow *ui;
QSqlTableModel *table_model;
QSqlDatabase db;
// functions
void initializeModel(QSqlTableModel *model);
};
#endif // MAINWINDOW_H
// mainwindow.cpp
#include <cstdlib>
#include "mainwindow.h"
#include "ui_mainwindow.h"
/*
* Target OS: Linux.
*/
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// set slots
connect(ui->dodajButton, SIGNAL(clicked()), SLOT(addRecord()));
connect(ui->actionUpdate, SIGNAL(triggered()), table_model, SLOT(submitAll()));
connect(ui->actionUsu_baz, SIGNAL(triggered()), SLOT(default_settings_db()));
connect(ui->dropButton, SIGNAL(clicked()), SLOT(drop_selected()));
// create directory of the application (target for Linux)
QString homepath(QDir::home().path());
QString app_path = homepath.append("/.studentsdb");
if(!QDir(app_path).exists()) QDir().mkdir(homepath);
QString db_path = app_path.append("/studenci.db");
// connect to database
db = QSqlDatabase::addDatabase("QSQLITE3");
db.setDatabaseName(db_path);
if(!db.open()) {
// error occurs when: $ chmod 000 ~/.studentsdb/studenci.db
QMessageBox::critical(this, tr("SQLite connection"), tr("Unable connect to DB, check file permission."));
exit(1);
} else {
QSqlQuery test_query(db);
if(!test_query.exec("SELECT imie, nazwisko, nr_albumu FROM studenci;")) {
QMessageBox::critical(this, tr("Table studenci doesn not exist"), tr("Creating new table"));
test_query.exec("DROP TABLE studenci;");
if(!test_query.exec("CREATE TABLE studenci(nr_albumu integer UNIQUE PRIMARY KEY,Imie text,Nazwisko text);")) {
QMessageBox::critical(this, tr("Unable to create example"), tr("Cannot create table"));
exit(1);
}
}
test_query.finish();
}
table_model = new QSqlTableModel(this, db);
// initialize SQL Table Model
initializeModel(table_model);
// bind model to QTableView
ui->tableView->setModel(table_model);
ui->tableView->hideColumn(0);
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tableView->setSelectionMode(QAbstractItemView::MultiSelection);
}
void MainWindow::initializeModel(QSqlTableModel *model)
{
model->setTable("studenci");
model->setEditStrategy(QSqlTableModel::OnFieldChange);
model->select();
}
/*
* Private slot.
*/
void MainWindow::addRecord()
{
QSqlQuery insert;
insert.prepare("INSERT INTO studenci (nazwisko, imie)"
"VALUES (?, ?)");
insert.bindValue(0, ui->edit_imie->text());
insert.bindValue(1, ui->edit_nazwisko->text());
if(!insert.exec())
QMessageBox::information(this, tr("Title"), tr("Insert failed"));
ui->edit_imie->clear();
ui->edit_nazwisko->clear();
table_model->select();
}
void MainWindow::default_settings_db()
{
QSqlQuery query(db);
QMessageBox::information(this, tr("Info"), tr("Creating new DB."));
query.exec("DROP TABLE studenci;");
query.exec("CREATE TABLE studenci(nr_albumu integer UNIQUE PRIMARY KEY,Imie text,Nazwisko text);");
table_model->select();
query.finish();
}
void MainWindow::drop_selected()
{
}
MainWindow::~MainWindow()
{
delete ui;
}