BandedTableView Example
#include <QtGui>
#include <QtSql>
#include <QMessageBox>
#include <QFileDialog>
#include "window.h"
inline QSqlTableModel* createSQLModel(QSqlDatabase& dataBase, const QString& tableName, QObject* parent)
{
if (tableName.isEmpty() || !dataBase.isValid())
return Q_NULL;
if (!dataBase.isOpen() && !dataBase.open())
return Q_NULL;
QSqlTableModel* sqlModel = new QSqlTableModel(parent, dataBase);
sqlModel->setTable(tableName);
sqlModel->select();
if (sqlModel->lastError().type() != QSqlError::NoError)
Q_DELETE_AND_NULL(sqlModel);
return sqlModel;
}
Window::Window()
: DemoMainWindow(QStringLiteral("QtitanDataGrid"), QStringLiteral(QTN_VERSION_DATAGRID_STR), tr("BandedTableView Example"))
{
Grid::loadTranslation();
m_grid = new Qtitan::Grid(this);
#ifndef Q_OS_ANDROID
QString path = QApplication::applicationDirPath();
path += QStringLiteral("/../examples/SQLFiles/assets");
#else
QString path = QDir::homePath();
copyAssetFile(path, "database.sqlite");
#endif
QSqlDatabase db = QSqlDatabase::addDatabase(QStringLiteral("QSQLITE"), QStringLiteral("database_demo"));
db.setDatabaseName(path + QStringLiteral("/database.sqlite"));
db.setHostName(QString());
db.setPort(-1);
if (!db.open(QString(), QString()))
{
QSqlError err = db.lastError();
QSqlDatabase::removeDatabase(QStringLiteral("database_demo"));
QMessageBox::critical(0, tr("SQL Error"), tr("Error: Can't open database - %1, error - %2").arg(db.databaseName()).arg(err.text()));
QApplication::exit(1);
return;
}
QSqlTableModel* model = createSQLModel(db, QStringLiteral("data"), m_grid);
if (model == Q_NULL)
{
QMessageBox::critical(0, tr("SQL Error"), tr("Error: SQL data base is not valid."));
QApplication::exit(1);
return;
}
m_grid->setViewType(Qtitan::Grid::BandedTableView);
Qtitan::GridBandedTableView* view = m_grid->view<Qtitan::GridBandedTableView>();
view->beginUpdate();
view->options().setSupportedDropActions(Qt::CopyAction);
view->options().setModelItemsDragEnabled(true);
view->options().setGestureEnabled(true);
view->tableOptions().setColumnsQuickCustomizationMaxDropDownCount(3);
connect(view, SIGNAL(contextMenu(ContextMenuEventArgs*)), this, SLOT(contextMenu(ContextMenuEventArgs* )));
Qtitan::GridTableBand* characteristicsBand = view->addBand(tr("Characteristics"));
Qtitan::GridTableBand* engineeringBand = view->addBand(tr("Engineering"));
characteristicsBand->setIcon(QPixmap(QStringLiteral(":/res/qtitanlogo64x64.png")));
characteristicsBand->setIconApperance(Qtitan::IconAlignLeft);
Qtitan::GridTableBand* visualBand = view->addBand(tr("Visual"));
Qtitan::GridTableBand* descriptionBand = view->addBand(tr("Description"));
Qtitan::GridTableBand* lineBand = view->addBand(tr("Line"));
Qtitan::GridTableBand* aircraftBand = view->addBand(tr("Details"));
descriptionBand->setBandIndex(engineeringBand->index());
visualBand->setBandIndex(engineeringBand->index());
lineBand->setBandIndex(characteristicsBand->index());
aircraftBand->setBandIndex(characteristicsBand->index());
view->setModel(model);
Qtitan::GridBandedTableColumn* column = (Qtitan::GridBandedTableColumn *)view->getColumnByModelColumnName(tr("Photo"));
column->setEditorType(GridEditor::Picture);
column->setIcon(QPixmap(QStringLiteral(":/res/qtitanlogo64x64.png")));
Qtitan::GridPictureEditorRepository* pictureEditor = (Qtitan::GridPictureEditorRepository *)column->editorRepository();
Q_UNUSED(pictureEditor);
column->setBandIndex(visualBand->index());
column->setRowSpan(3);
column->setRowIndex(0);
column = (Qtitan::GridBandedTableColumn *)view->getColumnByModelColumnName(tr("History"));
column->setEditorType(GridEditor::Memo);
Qtitan::GridMemoEditorRepository* memoEditor = (Qtitan::GridMemoEditorRepository *)column->editorRepository();
Q_UNUSED(memoEditor);
column->setBandIndex(engineeringBand->index());
column->setRowSpan(3);
column->setRowIndex(0);
column = (Qtitan::GridBandedTableColumn *)view->getColumnByModelColumnName(tr("Info"));
column->setEditorType(GridEditor::Memo);
memoEditor = (Qtitan::GridMemoEditorRepository *)column->editorRepository();
column->setBandIndex(engineeringBand->index());
column->setRowSpan(3);
column->setRowIndex(0);
column = (Qtitan::GridBandedTableColumn *)view->getColumnByModelColumnName(tr("Registration"));
column->setBandIndex(aircraftBand->index());
column->setRowIndex(0);
column = (Qtitan::GridBandedTableColumn *)view->getColumnByModelColumnName(tr("Aircraft"));
column->setIcon(QPixmap(QStringLiteral(":/res/qtitanlogo64x64.png")));
column->setBandIndex(aircraftBand->index());
column->setRowSpan(2);
column->setRowIndex(1);
column = (Qtitan::GridBandedTableColumn *)view->getColumnByModelColumnName(tr("Location"));
column->setIcon(QPixmap(QStringLiteral(":/res/qtitanlogo64x64.png")));
column->setBandIndex(lineBand->index());
column->setRowIndex(1);
column->addButton(GridColumn::ClearButtonIcon, Qtitan::AtEnd, Qtitan::GridColumn::MouseOverPolicy, tr("Text here"));
connect(column, SIGNAL(buttonClicked(CellButtonClickEventArgs*)), this, SLOT(cellButtonClicked(CellButtonClickEventArgs*)));
column = (Qtitan::GridBandedTableColumn *)view->getColumnByModelColumnName(tr("Date"));
column->setBandIndex(lineBand->index());
column->setRowIndex(2);
column->addButton(GridColumn::ClearButtonIcon, Qtitan::AtEnd, GridColumn::MouseOverPolicy);
connect(column, SIGNAL(buttonClicked(CellButtonClickEventArgs*)), this, SLOT(cellButtonClicked(CellButtonClickEventArgs*)));
connect(column, SIGNAL(buttonStateChanged(CellButtonEventArgs*)), this, SLOT(cellButtonStateChanged(CellButtonEventArgs*)));
for (int i = 0; i < view->getColumnCount(); ++i)
static_cast<GridTableColumn *>(view->getColumn(i))->setMenuButtonVisible(true);
view->endUpdate();
setDemoWidget(m_grid, createSettingsWidget());
}
QWidget* Window::createSettingsWidget()
{
QWidget* settings = new QWidget(this);
QVBoxLayout* l = new QVBoxLayout(settings);
l->addLayout(createStyleSetting());
QCheckBox* autoWidthCheck = new QCheckBox(settings);
autoWidthCheck->setText(tr("Column auto width"));
connect(autoWidthCheck, SIGNAL(stateChanged(int)), this, SLOT(autoWidthStateChanged(int)));
l->addWidget(autoWidthCheck);
autoWidthCheck->setChecked(true);
QCheckBox* checkBox = new QCheckBox(settings);
checkBox->setText(tr("Show Resize Content (new)"));
connect(checkBox, SIGNAL(stateChanged(int)), this, SLOT(showResizeContentChanged(int)));
checkBox->setChecked(true);
l->addWidget(checkBox);
QCheckBox* fastScrollCheck = new QCheckBox(settings);
fastScrollCheck->setText(tr("Fast scroll effect"));
connect(fastScrollCheck, SIGNAL(stateChanged(int)), this, SLOT(fastScrollChanged(int)));
l->addWidget(fastScrollCheck);
fastScrollCheck->setChecked(true);
QCheckBox* dottedLineCheck = new QCheckBox(settings);
dottedLineCheck->setText(tr("Dotted grid line"));
connect(dottedLineCheck, SIGNAL(stateChanged(int)), this, SLOT(dottedLineChanged(int)));
l->addWidget(dottedLineCheck);
dottedLineCheck->setChecked(true);
QLabel* label = new QLabel(this);
QHBoxLayout* hl = new QHBoxLayout(0);
label->setText(tr("Grid line style:"));
QComboBox* lineStylesSelect = new QComboBox(settings);
lineStylesSelect->addItem(QStringLiteral("None"));
lineStylesSelect->addItem(QStringLiteral("Both"));
lineStylesSelect->addItem(QStringLiteral("Both2D"));
lineStylesSelect->addItem(QStringLiteral("Horizontal"));
lineStylesSelect->addItem(QStringLiteral("Horizontal2D"));
lineStylesSelect->addItem(QStringLiteral("Vertical"));
lineStylesSelect->addItem(QStringLiteral("Vertical2D"));
connect(lineStylesSelect, SIGNAL(currentIndexChanged(int)), this, SLOT(selectGridLineStyles(int)));
QHBoxLayout* l2 = new QHBoxLayout(0);
QPushButton* button1 = new QPushButton(settings);
button1->setText(tr("Save to XML/FastInfoset"));
connect(button1, SIGNAL(clicked()), this, SLOT(saveLayout()));
l2->addWidget(button1);
QPushButton* button2 = new QPushButton(settings);
button2->setText(tr("Load from XML/FastInfoset"));
connect(button2, SIGNAL(clicked()), this, SLOT(loadLayout()));
l2->addWidget(button2);
hl->addWidget(label);
hl->addWidget(lineStylesSelect);
l->addLayout(hl);
l->addLayout(l2);
lineStylesSelect->setCurrentIndex(2);
QCheckBox* zoomEnable = new QCheckBox(settings);
zoomEnable->setText(tr("Zoom enabled"));
zoomEnable->setChecked(true);
connect(zoomEnable, SIGNAL(stateChanged(int)), this, SLOT(zoomEnabledChanged(int)));
l->addWidget(zoomEnable);
QCheckBox* zoomIndicator = new QCheckBox(settings);
zoomIndicator->setText(tr("Show zoom indicator"));
zoomIndicator->setChecked(true);
connect(zoomIndicator, SIGNAL(stateChanged(int)), this, SLOT(zoomIndicatorChanged(int)));
l->addWidget(zoomIndicator);
QSlider* zoomSlider = new QSlider(settings);
zoomSlider->setOrientation(Qt::Horizontal);
zoomSlider->setTickPosition(QSlider::TicksBothSides);
zoomSlider->setMinimum(25);
zoomSlider->setMaximum(300);
zoomSlider->setTickInterval(25);
zoomSlider->setSingleStep(25);
zoomSlider->setValue(100);
connect(zoomSlider, SIGNAL(sliderMoved(int)), this, SLOT(zoomValueChanged(int)));
connect(m_grid->view<Qtitan::GridTableView>(), SIGNAL(zoomChanged(int)), zoomSlider, SLOT(setValue(int)));
l->addWidget(zoomSlider);
QCheckBox* cellAutoRaise = new QCheckBox(settings);
cellAutoRaise->setText(tr("Auto raise cell button"));
connect(cellAutoRaise, SIGNAL(stateChanged(int)), this, SLOT(cellButtonAutoRaiseEnabled(int)));
cellAutoRaise->setChecked(true);
l->addWidget(cellAutoRaise);
QCheckBox* frozenRowsBox = new QCheckBox(settings);
frozenRowsBox->setText(tr("Frozen Rows"));
connect(frozenRowsBox, SIGNAL(stateChanged(int)), this, SLOT(frozenRowsEnabled(int)));
frozenRowsBox->setChecked(true);
l->addWidget(frozenRowsBox);
QCheckBox* transparentBox = new QCheckBox(settings);
transparentBox->setText(tr("Transparent Background"));
connect(transparentBox, SIGNAL(stateChanged(int)), this, SLOT(transparentBackgroundEnabled(int)));
transparentBox->setChecked(false);
l->addWidget(transparentBox);
QCheckBox* rowSizingBox = new QCheckBox(settings);
rowSizingBox->setText(tr("Resizing row (new)"));
connect(rowSizingBox, SIGNAL(stateChanged(int)), this, SLOT(rowSizingEnabled(int)));
rowSizingBox->setChecked(false);
l->addWidget(rowSizingBox);
QPushButton* printButton = new QPushButton(settings);
printButton->setText(tr("Print Preview"));
connect(printButton, SIGNAL(clicked()), this, SLOT(printPreview()));
l->addWidget(printButton);
return settings;
}
void Window::setShadeColor(const QColor& color)
{
m_grid->themeManager()->setShadeColor(color);
}
void Window::autoWidthStateChanged(int state)
{
Qtitan::GridTableView* view = m_grid->view<Qtitan::GridTableView>();
view->tableOptions().setColumnAutoWidth(state == Qt::Checked);
}
void Window::fastScrollChanged(int state)
{
Qtitan::GridTableView* view = m_grid->view<Qtitan::GridTableView>();
view->options().setFastScrollEffect(state == Qt::Checked);
}
void Window::dottedLineChanged(int state)
{
Qtitan::GridTableView* view = m_grid->view<Qtitan::GridTableView>();
QPen pen = view->options().gridLinePen();
pen.setStyle(state == Qt::Checked ? Qt::DotLine : Qt::SolidLine);
view->options().setGridLinePen(pen);
}
void Window::selectGridLineStyles(int index)
{
Qtitan::GridTableView* view = m_grid->view<Qtitan::GridTableView>();
switch (index)
{
case 0:
view->options().setGridLines(Qtitan::LinesNone);
break;
case 1:
view->options().setGridLines(Qtitan::LinesBoth);
break;
case 2:
view->options().setGridLines(Qtitan::LinesBoth2D);
break;
case 3:
view->options().setGridLines(Qtitan::LinesHorizontal);
break;
case 4:
view->options().setGridLines(Qtitan::LinesHorizontal2D);
break;
case 5:
view->options().setGridLines(Qtitan::LinesVertical);
break;
case 6:
view->options().setGridLines(Qtitan::LinesVertical2D);
break;
default:
view->options().setGridLines(Qtitan::LinesBoth);
}
}
void Window::saveLayout()
{
QString fileName = QFileDialog::getSaveFileName(this, tr("Save QtitanDataGrid Layout to File"),
QStringLiteral("qtitan-layout"), QStringLiteral("XML (*.xml);;FastInfoset (*.fi)"));
if (fileName.isEmpty())
return;
if (QFileInfo(fileName).completeSuffix().contains(QStringLiteral("xml"), Qt::CaseInsensitive))
m_grid->saveLayoutToFile(fileName);
else
{
FastInfosetStreamWriter writer(fileName);
m_grid->saveLayoutToXML(&writer);
}
}
void Window::loadLayout()
{
QStringList files = QFileDialog::getOpenFileNames(this, tr("Open QtitanDataGrid Layout File"),
QString(), QStringLiteral("XML (*.xml);;FastInfoset (*.fi)"));
QString fileName = files.size() > 0 ? files[0] : QString();
if (fileName.isEmpty())
return;
if (QFileInfo(fileName).completeSuffix().contains(QStringLiteral("xml"), Qt::CaseInsensitive))
m_grid->loadLayoutFromFile(fileName);
else
{
FastInfosetStreamReader reader(fileName);
m_grid->loadLayoutFromXML(&reader);
}
}
void Window::zoomEnabledChanged(int state)
{
Qtitan::GridTableView* view = m_grid->view<Qtitan::GridTableView>();
view->options().setZoomEnabled(state == Qt::Checked);
}
void Window::zoomIndicatorChanged(int state)
{
Qtitan::GridTableView* view = m_grid->view<Qtitan::GridTableView>();
view->options().setZoomIndicatorActive(state == Qt::Checked);
}
void Window::zoomValueChanged(int value)
{
double factor = qCeil((double)value / 25) * 25;
Qtitan::GridTableView* view = m_grid->view<Qtitan::GridTableView>();
view->options().setZoomFactor(factor / 100);
}
void Window::showResizeContentChanged(int state)
{
Qtitan::GridTableView* view = m_grid->view<Qtitan::GridTableView>();
view->tableOptions().setShowResizeContent(state == Qt::Checked);
}
void Window::cellButtonAutoRaiseEnabled(int state)
{
Qtitan::GridTableView* view = m_grid->view<Qtitan::GridTableView>();
view->options().setCellButtonAutoRaise(state == Qt::Checked);
}
void Window::frozenRowsEnabled(int state)
{
Qtitan::GridTableView* view = m_grid->view<Qtitan::GridTableView>();
view->tableOptions().setRowFrozenButtonVisible(state == Qt::Checked);
view->tableOptions().setFrozenPlaceQuickSelection(state == Qt::Checked);
}
void Window::transparentBackgroundEnabled(int state)
{
Qtitan::GridTableView* view = m_grid->view<Qtitan::GridTableView>();
view->options().setTransparentBackground(state == Qt::Checked);
view->options().setAlternatingRowColors(!view->options().alternatingRowColors());
}
void Window::rowSizingEnabled(int state)
{
Qtitan::GridTableView* view = m_grid->view<Qtitan::GridTableView>();
view->tableOptions().setRowSizingEnabled(state == Qt::Checked);
}
void Window::contextMenu(ContextMenuEventArgs* args)
{
args->contextMenu()->addAction(tr("Print Preview"), this, SLOT(printPreview()));
args->contextMenu()->addSeparator();
args->contextMenu()->addAction(tr("Developer Machines on the Web"), this, SLOT(showCompanyWebSite()));
}
void Window::cellButtonClicked(CellButtonClickEventArgs* args)
{
QMessageBox::information(this, tr("Cell button clicked"),
tr("Clicked: Button - %1, Column Title - %2, RowIndex - %3").arg(args->buttonIndex()).arg(args->column()->caption()).arg(args->row().rowIndex()));
}
void Window::cellButtonStateChanged(CellButtonEventArgs* args)
{
if (args->row().rowIndex() == 1 || args->row().rowIndex() == 2)
args->setEnabled(false);
}
void Window::printPreview()
{
m_grid->view<Qtitan::GridTableView>()->printPreview();
}