#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QSqlRecord>
#include <QFileDialog>
#include <QSize>
#include "mapdelegate.h"
#include <QMouseEvent>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
QByteArray property("pixmap");
ui->setupUi(this);
this->initDB();
model = new QSqlTableModel(this);
mapper = new QDataWidgetMapper(this);
model->setTable("person");
model->select();
mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);
mapper->setModel(model);
mapper->addMapping(ui->lineEdit_name, model->fieldIndex("name"));
mapper->addMapping(ui->lineEdit_title, model->fieldIndex("title"));
mapper->addMapping(ui->lineEdit_address, model->fieldIndex("address"));
mapper->addMapping(ui->lineEdit_tel, model->fieldIndex("tel"));
mapper->addMapping(ui->lineEdit_mobile, model->fieldIndex("mobile"));
mapper->addMapping(ui->lineEdit_group, model->fieldIndex("grp"));
mapper->addMapping(ui->label_photo, model->fieldIndex("pic"));
ui->label_photo->setPixmap(NULL);
MapDelegate *delegate = new MapDelegate(this);
mapper->setItemDelegate(delegate);
mapper->toFirst();
initListWidget();
ui->listWidget->setCurrentRow(mapper->currentIndex());
updateUI();
//注册监视对象
ui->label_photo->installEventFilter(this);
}
MainWindow::~MainWindow()
{
delete ui;
delete model;
delete mapper;
}
bool MainWindow::initListWidget()
{
bool bRet = false;
int iCnt = 0;
QSqlQuery query;
ui->listWidget->clear();
iCnt = model->rowCount();
if(iCnt>0)
{
for (int i = 0; i < iCnt; ++i) {
QString strName = model->record(i).value("name").toString();
ui->listWidget->addItem(strName);
}
}
return bRet;
}
bool MainWindow::initDB()
{
bool bRet = true;
QString strDBFile = QCoreApplication::applicationDirPath() + "/ContactsDB.db";
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(strDBFile);
if(!QFile::exists(strDBFile))
{
if (!db.open()) {
QMessageBox::critical(0, qApp->tr("Cannot open database"),
qApp->tr("Unable to establish a database connection.\n"
"This program needs SQLite support. Please read "
"the Qt SQL driver documentation for information how "
"to build it.\n\n"
"Click Cancel to exit."), QMessageBox::Cancel);
return false;
}
else{
QSqlQuery create;
bRet = create.exec("CREATE TABLE person(id INTEGER PRIMARY KEY,"
"name TEXT(20),"
"title TEXT(20),"
"address TEXT(100),"
"tel TEXT(12),"
"mobile TEXT(12),"
"grp TEXT(40),"
"pic BLOB(64000))");
db.close();
}
}
else{
db.open();
}
return true;
}
void MainWindow::on_pushButton_del_clicked()
{
int index = 0;
int row = mapper->currentIndex();
model->removeRow(row);
mapper->submit();
this->initListWidget();
index = qMax(0,row-1);
ui->listWidget->setCurrentRow(index);
ui->listWidget->setCurrentItem(ui->listWidget->currentItem());
}
void MainWindow::on_listWidget_currentRowChanged(int currentRow)
{
mapper->setCurrentIndex(currentRow);
updateUI();
}
void MainWindow::addPerson()
{
QString strName = ui->lineEdit_name->text();
QString strTitle = ui->lineEdit_title->text();
QString strAddr = ui->lineEdit_address->text();
QString strTel = ui->lineEdit_tel->text();
QString strMobile = ui->lineEdit_mobile->text();
QString strGrp = ui->lineEdit_group->text();
QSqlField nameField("name", QVariant::String);
QSqlField titleField("title", QVariant::String);
QSqlField addrField("address", QVariant::String);
QSqlField telField("tel", QVariant::String);
QSqlField mobileField("mobile", QVariant::String);
QSqlField groupField("grp", QVariant::String);
QSqlField picField("pic", QVariant::ByteArray);
QByteArray bytesPic;
QBuffer buffer(&bytesPic);
buffer.open(QIODevice::WriteOnly);
ui->label_photo->pixmap()->save(&buffer, "JPG");
model->setFilter("");
model->select();
nameField.setValue(strName);
titleField.setValue(strTitle);
addrField.setValue(strAddr);
telField.setValue(strTel);
mobileField.setValue(strMobile);
groupField.setValue(strGrp);
picField.setValue(bytesPic);
QSqlRecord record;
record.append(nameField);
record.append(titleField);
record.append(addrField);
record.append(telField);
record.append(mobileField);
record.append(groupField);
record.append(picField);
model->insertRecord(-1, record);
ui->lineEdit_name->clear();
ui->lineEdit_title->clear();
ui->lineEdit_address->clear();
ui->lineEdit_tel->clear();
ui->lineEdit_mobile->clear();
ui->lineEdit_group->clear();
ui->label_photo->setPixmap(NULL);
}
void MainWindow::updateUI()
{
if(ui->lineEdit_name->text().isEmpty())
{
ui->pushButton_add->setEnabled(false);
ui->pushButton_Update->setEnabled(false);
}
else
{
ui->pushButton_add->setEnabled(true);
ui->pushButton_Update->setEnabled(true);
}
if(model->rowCount() > 0)
{
ui->pushButton_del->setEnabled(true);
}
else
{
ui->pushButton_del->setEnabled(false);
ui->pushButton_Update->setEnabled(false);
}
}
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if (obj == ui->label_photo) {
if (event->type() == QEvent::Enter) {
qDebug() << "mouse enter ";
return true;
} else if (event->type() == QEvent::Leave) {
qDebug() << "mouse leave ";
} else {
return false;
}
} else {
// pass the event on to the parent class
return QMainWindow::eventFilter(obj, event);
}
return true;
}
void MainWindow::on_pushButton_add_clicked()
{
this->addPerson();
this->initListWidget();
// mapper->toLast();
ui->listWidget->setCurrentRow(mapper->currentIndex());
}
void MainWindow::on_pushButton_Update_clicked()
{
int mapIndex = mapper->currentIndex();
model->database().transaction(); //开始事务操作
// if (model->submitAll()) {
if(mapper->submit()){
model->submitAll();
model->database().commit(); //提交
} else {
model->database().rollback(); //回滚
QMessageBox::warning(this, tr("model"),
tr("DB Error: %1").arg(model->lastError().text()));
}
this->initListWidget();
mapper->setCurrentIndex(mapIndex);
ui->listWidget->setCurrentRow(mapIndex);
}
void MainWindow::on_lineEdit_Find_textChanged(QString )
{
QString strName = ui->lineEdit_Find->text();
if(!strName.isEmpty())
{
model->setFilter(QString::fromLocal8Bit("name like '%1'").arg(QString("%")+=strName+=QString("%")));
}
else{
model->setFilter("");
}
model->select(); //显示结果
this->initListWidget();
}
void MainWindow::on_pushButton_Browse_clicked()
{
QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"),
QDir::currentPath(),
tr("Images (*.png *.xpm *.jpg)"));
QImage image(fileName);
setIma
- 1
- 2
前往页