Doc: Clean up and modernize SQL example: Books

* Replace Qt4-style connects.
* Reformat code to adhere to 80 column width.
* Touch comments to make location and style consistent.
* Rename a label in the UI form.

Task-number: QTBUG-68652
Change-Id: Icc592f7b5a013d1806bc36c45057b35472b6efbb
Reviewed-by: Topi Reiniö <topi.reinio@qt.io>
This commit is contained in:
Paul Wicking 2018-06-05 13:13:38 +02:00
parent d9d77e8680
commit ce7cbcc3b6
3 changed files with 135 additions and 102 deletions

View File

@ -62,15 +62,21 @@ void BookDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
{ {
if (index.column() != 5) { if (index.column() != 5) {
QStyleOptionViewItem opt = option; QStyleOptionViewItem opt = option;
opt.rect.adjust(0, 0, -1, -1); // since we draw the grid ourselves // Since we draw the grid ourselves:
opt.rect.adjust(0, 0, -1, -1);
QSqlRelationalDelegate::paint(painter, opt, index); QSqlRelationalDelegate::paint(painter, opt, index);
} else { } else {
const QAbstractItemModel *model = index.model(); const QAbstractItemModel *model = index.model();
QPalette::ColorGroup cg = (option.state & QStyle::State_Enabled) ? QPalette::ColorGroup cg = (option.state & QStyle::State_Enabled) ?
(option.state & QStyle::State_Active) ? QPalette::Normal : QPalette::Inactive : QPalette::Disabled; (option.state & QStyle::State_Active) ?
QPalette::Normal :
QPalette::Inactive :
QPalette::Disabled;
if (option.state & QStyle::State_Selected) if (option.state & QStyle::State_Selected)
painter->fillRect(option.rect, option.palette.color(cg, QPalette::Highlight)); painter->fillRect(
option.rect,
option.palette.color(cg, QPalette::Highlight));
int rating = model->data(index, Qt::DisplayRole).toInt(); int rating = model->data(index, Qt::DisplayRole).toInt();
int width = star.width(); int width = star.width();
@ -81,7 +87,8 @@ void BookDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
painter->drawPixmap(x, y, star); painter->drawPixmap(x, y, star);
x += width; x += width;
} }
drawFocus(painter, option, option.rect.adjusted(0, 0, -1, -1)); // since we draw the grid ourselves // Since we draw the grid ourselves:
drawFocus(painter, option, option.rect.adjusted(0, 0, -1, -1));
} }
QPen pen = painter->pen(); QPen pen = painter->pen();
@ -96,8 +103,8 @@ QSize BookDelegate::sizeHint(const QStyleOptionViewItem &option,
{ {
if (index.column() == 5) if (index.column() == 5)
return QSize(5 * star.width(), star.height()) + QSize(1, 1); return QSize(5 * star.width(), star.height()) + QSize(1, 1);
// Since we draw the grid ourselves:
return QSqlRelationalDelegate::sizeHint(option, index) + QSize(1, 1); // since we draw the grid ourselves return QSqlRelationalDelegate::sizeHint(option, index) + QSize(1, 1);
} }
bool BookDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, bool BookDelegate::editorEvent(QEvent *event, QAbstractItemModel *model,
@ -112,19 +119,21 @@ bool BookDelegate::editorEvent(QEvent *event, QAbstractItemModel *model,
int stars = qBound(0, int(0.7 + qreal(mouseEvent->pos().x() int stars = qBound(0, int(0.7 + qreal(mouseEvent->pos().x()
- option.rect.x()) / star.width()), 5); - option.rect.x()) / star.width()), 5);
model->setData(index, QVariant(stars)); model->setData(index, QVariant(stars));
return false; //so that the selection can change // So that the selection can change:
return false;
} }
return true; return true;
} }
QWidget *BookDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, QWidget *BookDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index) const const QModelIndex &index) const
{ {
if (index.column() != 4) if (index.column() != 4)
return QSqlRelationalDelegate::createEditor(parent, option, index); return QSqlRelationalDelegate::createEditor(parent, option, index);
// for editing the year, return a spinbox with a range from -1000 to 2100. // For editing the year, return a spinbox with a range from -1000 to 2100.
QSpinBox *sb = new QSpinBox(parent); QSpinBox *sb = new QSpinBox(parent);
sb->setFrame(false); sb->setFrame(false);
sb->setMaximum(2100); sb->setMaximum(2100);
@ -132,4 +141,3 @@ QWidget *BookDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem
return sb; return sb;
} }

View File

@ -59,53 +59,61 @@ BookWindow::BookWindow()
ui.setupUi(this); ui.setupUi(this);
if (!QSqlDatabase::drivers().contains("QSQLITE")) if (!QSqlDatabase::drivers().contains("QSQLITE"))
QMessageBox::critical(this, "Unable to load database", "This demo needs the SQLITE driver"); QMessageBox::critical(
this,
"Unable to load database",
"This demo needs the SQLITE driver"
);
// initialize the database // Initialize the database:
QSqlError err = initDb(); QSqlError err = initDb();
if (err.type() != QSqlError::NoError) { if (err.type() != QSqlError::NoError) {
showError(err); showError(err);
return; return;
} }
// Create the data model // Create the data model:
model = new QSqlRelationalTableModel(ui.bookTable); model = new QSqlRelationalTableModel(ui.bookTable);
model->setEditStrategy(QSqlTableModel::OnManualSubmit); model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->setTable("books"); model->setTable("books");
// Remember the indexes of the columns // Remember the indexes of the columns:
authorIdx = model->fieldIndex("author"); authorIdx = model->fieldIndex("author");
genreIdx = model->fieldIndex("genre"); genreIdx = model->fieldIndex("genre");
// Set the relations to the other database tables // Set the relations to the other database tables:
model->setRelation(authorIdx, QSqlRelation("authors", "id", "name")); model->setRelation(authorIdx, QSqlRelation("authors", "id", "name"));
model->setRelation(genreIdx, QSqlRelation("genres", "id", "name")); model->setRelation(genreIdx, QSqlRelation("genres", "id", "name"));
// Set the localized header captions // Set the localized header captions:
model->setHeaderData(authorIdx, Qt::Horizontal, tr("Author Name")); model->setHeaderData(authorIdx, Qt::Horizontal, tr("Author Name"));
model->setHeaderData(genreIdx, Qt::Horizontal, tr("Genre")); model->setHeaderData(genreIdx, Qt::Horizontal, tr("Genre"));
model->setHeaderData(model->fieldIndex("title"), Qt::Horizontal, tr("Title")); model->setHeaderData(model->fieldIndex("title"),
Qt::Horizontal, tr("Title"));
model->setHeaderData(model->fieldIndex("year"), Qt::Horizontal, tr("Year")); model->setHeaderData(model->fieldIndex("year"), Qt::Horizontal, tr("Year"));
model->setHeaderData(model->fieldIndex("rating"), Qt::Horizontal, tr("Rating")); model->setHeaderData(model->fieldIndex("rating"),
Qt::Horizontal, tr("Rating"));
// Populate the model // Populate the model:
if (!model->select()) { if (!model->select()) {
showError(model->lastError()); showError(model->lastError());
return; return;
} }
// Set the model and hide the ID column // Set the model and hide the ID column:
ui.bookTable->setModel(model); ui.bookTable->setModel(model);
ui.bookTable->setItemDelegate(new BookDelegate(ui.bookTable)); ui.bookTable->setItemDelegate(new BookDelegate(ui.bookTable));
ui.bookTable->setColumnHidden(model->fieldIndex("id"), true); ui.bookTable->setColumnHidden(model->fieldIndex("id"), true);
ui.bookTable->setSelectionMode(QAbstractItemView::SingleSelection); ui.bookTable->setSelectionMode(QAbstractItemView::SingleSelection);
// Initialize the Author combo box // Initialize the Author combo box:
ui.authorEdit->setModel(model->relationModel(authorIdx)); ui.authorEdit->setModel(model->relationModel(authorIdx));
ui.authorEdit->setModelColumn(model->relationModel(authorIdx)->fieldIndex("name")); ui.authorEdit->setModelColumn(
model->relationModel(authorIdx)->fieldIndex("name"));
ui.genreEdit->setModel(model->relationModel(genreIdx)); ui.genreEdit->setModel(model->relationModel(genreIdx));
ui.genreEdit->setModelColumn(model->relationModel(genreIdx)->fieldIndex("name")); ui.genreEdit->setModelColumn(
model->relationModel(genreIdx)->fieldIndex("name"));
QDataWidgetMapper *mapper = new QDataWidgetMapper(this); QDataWidgetMapper *mapper = new QDataWidgetMapper(this);
mapper->setModel(model); mapper->setModel(model);
@ -116,8 +124,11 @@ BookWindow::BookWindow()
mapper->addMapping(ui.genreEdit, genreIdx); mapper->addMapping(ui.genreEdit, genreIdx);
mapper->addMapping(ui.ratingEdit, model->fieldIndex("rating")); mapper->addMapping(ui.ratingEdit, model->fieldIndex("rating"));
connect(ui.bookTable->selectionModel(), SIGNAL(currentRowChanged(QModelIndex,QModelIndex)), connect(ui.bookTable->selectionModel(),
mapper, SLOT(setCurrentModelIndex(QModelIndex))); &QItemSelectionModel::currentRowChanged,
mapper,
&QDataWidgetMapper::setCurrentModelIndex
);
ui.bookTable->setCurrentIndex(model->index(0, 0)); ui.bookTable->setCurrentIndex(model->index(0, 0));
} }
@ -127,4 +138,3 @@ void BookWindow::showError(const QSqlError &err)
QMessageBox::critical(this, "Unable to initialize Database", QMessageBox::critical(this, "Unable to initialize Database",
"Error initializing database: " + err.text()); "Error initializing database: " + err.text());
} }

View File

@ -1,10 +1,8 @@
<ui version="4.0" > <?xml version="1.0" encoding="UTF-8"?>
<author></author> <ui version="4.0">
<comment></comment>
<exportmacro></exportmacro>
<class>BookWindow</class> <class>BookWindow</class>
<widget class="QMainWindow" name="BookWindow" > <widget class="QMainWindow" name="BookWindow">
<property name="geometry" > <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
@ -12,117 +10,135 @@
<height>420</height> <height>420</height>
</rect> </rect>
</property> </property>
<property name="windowTitle" > <property name="windowTitle">
<string>Books</string> <string>Books</string>
</property> </property>
<widget class="QWidget" name="centralWidget" > <widget class="QWidget" name="centralWidget">
<layout class="QVBoxLayout" > <layout class="QVBoxLayout">
<property name="margin" > <property name="spacing">
<number>9</number>
</property>
<property name="spacing" >
<number>6</number> <number>6</number>
</property> </property>
<property name="leftMargin">
<number>9</number>
</property>
<property name="topMargin">
<number>9</number>
</property>
<property name="rightMargin">
<number>9</number>
</property>
<property name="bottomMargin">
<number>9</number>
</property>
<item> <item>
<widget class="QGroupBox" name="groupBox" > <widget class="QGroupBox" name="groupBox">
<property name="title" > <property name="title">
<string>Books</string> <string>Books</string>
</property> </property>
<layout class="QVBoxLayout" > <layout class="QVBoxLayout">
<property name="margin" > <property name="spacing">
<number>9</number>
</property>
<property name="spacing" >
<number>6</number> <number>6</number>
</property> </property>
<property name="leftMargin">
<number>9</number>
</property>
<property name="topMargin">
<number>9</number>
</property>
<property name="rightMargin">
<number>9</number>
</property>
<property name="bottomMargin">
<number>9</number>
</property>
<item> <item>
<widget class="QTableView" name="bookTable" > <widget class="QTableView" name="bookTable">
<property name="selectionBehavior" > <property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum> <enum>QAbstractItemView::SelectRows</enum>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QGroupBox" name="groupBox_2" > <widget class="QGroupBox" name="groupBox_2">
<property name="title" > <property name="title">
<string>Details</string> <string>Details</string>
</property> </property>
<layout class="QFormLayout" > <layout class="QFormLayout">
<item row="0" column="0" > <item row="0" column="0">
<widget class="QLabel" name="label_5" > <widget class="QLabel" name="label_5">
<property name="text" > <property name="text">
<string>&lt;b>Title:&lt;/b></string> <string>&lt;b&gt;Title:&lt;/b&gt;</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1" > <item row="0" column="1">
<widget class="QLineEdit" name="titleEdit" > <widget class="QLineEdit" name="titleEdit">
<property name="enabled" > <property name="enabled">
<bool>true</bool> <bool>true</bool>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0" > <item row="1" column="0">
<widget class="QLabel" name="label_2_2_2_2" > <widget class="QLabel" name="label_2">
<property name="text" > <property name="text">
<string>&lt;b>Author: &lt;/b></string> <string>&lt;b&gt;Author: &lt;/b&gt;</string>
</property>
</widget>
</item>
<item row="1" column="1" >
<widget class="QComboBox" name="authorEdit" >
<property name="enabled" >
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="0" >
<widget class="QLabel" name="label_3" >
<property name="text" >
<string>&lt;b>Genre:&lt;/b></string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="1" > <item row="1" column="1">
<widget class="QComboBox" name="genreEdit" > <widget class="QComboBox" name="authorEdit">
<property name="enabled" > <property name="enabled">
<bool>true</bool> <bool>true</bool>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="0" > <item row="2" column="0">
<widget class="QLabel" name="label_4" > <widget class="QLabel" name="label_3">
<property name="text" > <property name="text">
<string>&lt;b>Year:&lt;/b></string> <string>&lt;b&gt;Genre:&lt;/b&gt;</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="1" > <item row="2" column="1">
<widget class="QSpinBox" name="yearEdit" > <widget class="QComboBox" name="genreEdit">
<property name="enabled" > <property name="enabled">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="prefix" > </widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>&lt;b&gt;Year:&lt;/b&gt;</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QSpinBox" name="yearEdit">
<property name="enabled">
<bool>true</bool>
</property>
<property name="prefix">
<string/> <string/>
</property> </property>
<property name="maximum" > <property name="minimum">
<number>2100</number>
</property>
<property name="minimum" >
<number>-1000</number> <number>-1000</number>
</property> </property>
</widget> <property name="maximum">
</item> <number>2100</number>
<item row="4" column="0" >
<widget class="QLabel" name="label" >
<property name="text" >
<string>&lt;b>Rating:&lt;/b></string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="1" > <item row="4" column="0">
<widget class="QSpinBox" name="ratingEdit" > <widget class="QLabel" name="label">
<property name="maximum" > <property name="text">
<string>&lt;b&gt;Rating:&lt;/b&gt;</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QSpinBox" name="ratingEdit">
<property name="maximum">
<number>5</number> <number>5</number>
</property> </property>
</widget> </widget>
@ -136,7 +152,6 @@
</layout> </layout>
</widget> </widget>
</widget> </widget>
<pixmapfunction></pixmapfunction>
<tabstops> <tabstops>
<tabstop>bookTable</tabstop> <tabstop>bookTable</tabstop>
<tabstop>titleEdit</tabstop> <tabstop>titleEdit</tabstop>