Qt 小例子学习47 - StackedBarSeries qml
SqlTrafficModel.h
#ifndef SQLTRAFFICMODEL_H
#define SQLTRAFFICMODEL_H
#include <QSqlQuery>
#include <QSqlQueryModel>
class SqlTrafficModel : public QSqlQueryModel
{
Q_OBJECT
Q_PROPERTY(QString queryStr READ queryStr WRITE setQueryStr NOTIFY queryStrChanged)
public:
SqlTrafficModel(QObject *parent = nullptr) : QSqlQueryModel(parent) {}
Q_INVOKABLE QStringList getColumn(int col)
{
QStringList mColumn;
for (int row = 0; row < rowCount(); ++row)
{
mColumn << index(row, col).data().toString();
}
return mColumn;
}
QString queryStr() const { return mQueryStr; }
void setQueryStr(const QString &queryStr)
{
if (queryStr == mQueryStr)
return;
mQueryStr = queryStr;
setQuery(mQueryStr);
emit queryStrChanged();
}
signals:
void queryStrChanged();
private:
QString mQueryStr;
};
#endif // SQLTRAFFICMODEL_H
main.qml
import QtQuick 2.9
import QtQuick.Window 2.2
import QtCharts 2.2
import com.eyllanesc.models 1.0
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
visibility: Window.FullScreen
ChartView {
anchors.fill: parent
antialiasing: true
StackedBarSeries {
VBarModelMapper {
model: SqlTrafficModel {
id: trafficModel
queryStr: "select * from traffic"
onModelReset: bar_axis.categories = getColumn(0)
Component.onCompleted: bar_axis.categories = getColumn(0)
}
firstBarSetColumn: 1
lastBarSetColumn: 2
firstRow: 0
}
axisX: BarCategoryAxis {
id: bar_axis
}
}
}
}
main.cpp
#include "sqltrafficmodel.h"
#include <QApplication>
#include <QDateTime>
#include <QDebug>
#include <QQmlApplicationEngine>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
if (!db.open())
{
qDebug() << "Cannot open database\n"
"Unable to establish a database connection.\n"
"This example needs SQLite support. Please read "
"the Qt SQL driver documentation for information how "
"to build it.\n\n"
"Click Cancel to exit.";
return false;
}
QSqlQuery query;
if (!query.exec("create table traffic (date DATE default CURRENT_DATE, sent "
"INTEGER, recv INTEGER)"))
{
qDebug() << query.lastError().text();
}
QTime time = QTime::currentTime();
qsrand((uint)time.msec());
QDate today = QDate::currentDate();
for (int i = 0; i < 10; i++)
{
query.prepare("insert into traffic values(:date, :sent, :recv)");
query.bindValue(":date", today.addDays(i));
query.bindValue(":sent", qrand() % 1000);
query.bindValue(":recv", qrand() % 1000);
if (!query.exec())
{
qDebug() << query.lastError().text();
}
}
return true;
}
int main(int argc, char *argv[])
{
#if defined(Q_OS_WIN)
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
QApplication app(argc, argv);
if (!createConnection())
return -1;
qmlRegisterType<SqlTrafficModel>("com.eyllanesc.models", 1, 0,
"SqlTrafficModel");
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}