Books▲
Sélectionnez
/**
**************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the demonstration applications of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
***************************************************************************
*/
#include
"bookwindow.h"
#include
"bookdelegate.h"
#include
"initdb.h"
#include <QtSql>
BookWindow::
BookWindow()
{
ui.setupUi(this
);
if
(!
QSqlDatabase::
drivers().contains("QSQLITE"
))
QMessageBox::
critical(
this
,
"Unable to load database"
,
"This demo needs the SQLITE driver"
);
// Initialize the database:
QSqlError err =
initDb();
if
(err.type() !=
QSqlError::
NoError) {
showError(err);
return
;
}
// Create the data model:
model =
new
QSqlRelationalTableModel(ui.bookTable);
model-&
gt;setEditStrategy(QSqlTableModel::
OnManualSubmit);
model-&
gt;setTable("books"
);
// Remember the indexes of the columns:
authorIdx =
model-&
gt;fieldIndex("author"
);
genreIdx =
model-&
gt;fieldIndex("genre"
);
// Set the relations to the other database tables:
model-&
gt;setRelation(authorIdx, QSqlRelation("authors"
, "id"
, "name"
));
model-&
gt;setRelation(genreIdx, QSqlRelation("genres"
, "id"
, "name"
));
// Set the localized header captions:
model-&
gt;setHeaderData(authorIdx, Qt::
Horizontal, tr("Author Name"
));
model-&
gt;setHeaderData(genreIdx, Qt::
Horizontal, tr("Genre"
));
model-&
gt;setHeaderData(model-&
gt;fieldIndex("title"
),
Qt::
Horizontal, tr("Title"
));
model-&
gt;setHeaderData(model-&
gt;fieldIndex("year"
), Qt::
Horizontal, tr("Year"
));
model-&
gt;setHeaderData(model-&
gt;fieldIndex("rating"
),
Qt::
Horizontal, tr("Rating"
));
// Populate the model:
if
(!
model-&
gt;select()) {
showError(model-&
gt;lastError());
return
;
}
// Set the model and hide the ID column:
ui.bookTable-&
gt;setModel(model);
ui.bookTable-&
gt;setItemDelegate(new
BookDelegate(ui.bookTable));
ui.bookTable-&
gt;setColumnHidden(model-&
gt;fieldIndex("id"
), true
);
ui.bookTable-&
gt;setSelectionMode(QAbstractItemView::
SingleSelection);
// Initialize the Author combo box:
ui.authorEdit-&
gt;setModel(model-&
gt;relationModel(authorIdx));
ui.authorEdit-&
gt;setModelColumn(
model-&
gt;relationModel(authorIdx)-&
gt;fieldIndex("name"
));
ui.genreEdit-&
gt;setModel(model-&
gt;relationModel(genreIdx));
ui.genreEdit-&
gt;setModelColumn(
model-&
gt;relationModel(genreIdx)-&
gt;fieldIndex("name"
));
// Lock and prohibit resizing of the width of the rating column:
ui.bookTable-&
gt;horizontalHeader()-&
gt;setSectionResizeMode(
model-&
gt;fieldIndex("rating"
),
QHeaderView::
ResizeToContents);
QDataWidgetMapper *
mapper =
new
QDataWidgetMapper(this
);
mapper-&
gt;setModel(model);
mapper-&
gt;setItemDelegate(new
BookDelegate(this
));
mapper-&
gt;addMapping(ui.titleEdit, model-&
gt;fieldIndex("title"
));
mapper-&
gt;addMapping(ui.yearEdit, model-&
gt;fieldIndex("year"
));
mapper-&
gt;addMapping(ui.authorEdit, authorIdx);
mapper-&
gt;addMapping(ui.genreEdit, genreIdx);
mapper-&
gt;addMapping(ui.ratingEdit, model-&
gt;fieldIndex("rating"
));
connect(ui.bookTable-&
gt;selectionModel(),
&
amp;QItemSelectionModel::
currentRowChanged,
mapper,
&
amp;QDataWidgetMapper::
setCurrentModelIndex
);
ui.bookTable-&
gt;setCurrentIndex(model-&
gt;index(0
, 0
));
createMenuBar();
}
void
BookWindow::
showError(const
QSqlError &
amp;err)
{
QMessageBox::
critical(this
, "Unable to initialize Database"
,
"Error initializing database: "
+
err.text());
}
void
BookWindow::
createMenuBar()
{
QAction *
quitAction =
new
QAction(tr("&Quit"
), this
);
QAction *
aboutAction =
new
QAction(tr("&About"
), this
);
QAction *
aboutQtAction =
new
QAction(tr("&About Qt"
), this
);
QMenu *
fileMenu =
menuBar()-&
gt;addMenu(tr("&File"
));
fileMenu-&
gt;addAction(quitAction);
QMenu *
helpMenu =
menuBar()-&
gt;addMenu(tr("&Help"
));
helpMenu-&
gt;addAction(aboutAction);
helpMenu-&
gt;addAction(aboutQtAction);
connect(quitAction, &
amp;QAction::
triggered, this
, &
amp;BookWindow::
close);
connect(aboutAction, &
amp;QAction::
triggered, this
, &
amp;BookWindow::
about);
connect(aboutQtAction, &
amp;QAction::
triggered, qApp, &
amp;QApplication::
aboutQt);
}
void
BookWindow::
about()
{
QMessageBox::
about(this
, tr("About Books"
),
tr("<p>The <b>Books</b> example shows how to use Qt SQL classes "
"with a model/view framework."
));
}