add book
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
# Copyright (c) Daniel Gakwaya.
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
|
||||
project(10-PathView VERSION 0.1 LANGUAGES CXX)
|
||||
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
find_package(Qt6 6.5 REQUIRED COMPONENTS Quick)
|
||||
|
||||
qt_standard_project_setup(REQUIRES 6.5)
|
||||
|
||||
qt_add_executable(app10-PathView
|
||||
main.cpp
|
||||
)
|
||||
|
||||
qt_add_qml_module(app10-PathView
|
||||
URI 10-PathView
|
||||
VERSION 1.0
|
||||
QML_FILES Main.qml
|
||||
)
|
||||
|
||||
set_target_properties(app10-PathView PROPERTIES
|
||||
MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
|
||||
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
|
||||
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
|
||||
MACOSX_BUNDLE TRUE
|
||||
WIN32_EXECUTABLE TRUE
|
||||
)
|
||||
|
||||
target_link_libraries(app10-PathView
|
||||
PRIVATE Qt6::Quick
|
||||
)
|
||||
|
||||
install(TARGETS app10-PathView
|
||||
BUNDLE DESTINATION .
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
)
|
||||
@@ -0,0 +1,203 @@
|
||||
// Copyright (c) Daniel Gakwaya.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
import QtQuick
|
||||
import QtQuick.Window
|
||||
|
||||
Window {
|
||||
id: rootId
|
||||
width: 340
|
||||
height: 480
|
||||
visible: true
|
||||
title: qsTr("PathView")
|
||||
|
||||
Rectangle {
|
||||
width: parent.width
|
||||
height: parent.height
|
||||
color: "#EBEBEB"
|
||||
|
||||
|
||||
ListModel {
|
||||
id: modelId
|
||||
ListElement { our_color: "red" }
|
||||
ListElement { our_color: "green" }
|
||||
ListElement { our_color: "blue" }
|
||||
ListElement { our_color: "yellow" }
|
||||
ListElement { our_color: "black" }
|
||||
ListElement { our_color: "dodgerblue" }
|
||||
ListElement { our_color: "purple" }
|
||||
ListElement { our_color: "magenta" }
|
||||
ListElement { our_color: "yellowgreen" }
|
||||
ListElement { our_color: "skyblue" }
|
||||
}
|
||||
|
||||
|
||||
Component {
|
||||
id: delegateId
|
||||
Column {
|
||||
//opacity: PathView.opacity
|
||||
scale: PathView.scale
|
||||
opacity: PathView.isCurrentItem ? 1 : 0.3
|
||||
readonly property bool is_current: PathView.isCurrentItem
|
||||
|
||||
|
||||
/*
|
||||
Rectangle{
|
||||
width: 5
|
||||
height: 5
|
||||
color: "black"
|
||||
radius: 5
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
Rectangle {
|
||||
anchors.horizontalCenter: textId.horizontalCenter
|
||||
width: 64
|
||||
height: 64
|
||||
radius: 20
|
||||
color: model.our_color
|
||||
MouseArea{
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
if(is_current){
|
||||
console.log("Clicked on "+ model.our_color)
|
||||
}else{
|
||||
console.log("Not current item")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Text {
|
||||
id: textId
|
||||
text: model.our_color; font.pixelSize: 24
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PathView {
|
||||
anchors.fill: parent
|
||||
model: modelId
|
||||
//model: 100
|
||||
delegate: delegateId
|
||||
focus: true
|
||||
|
||||
path: Path {
|
||||
|
||||
//Bottom : Starting Point
|
||||
startX: rootId.width/2
|
||||
startY: rootId.height - 50
|
||||
|
||||
PathAttribute{
|
||||
name: "scale"
|
||||
value: 1
|
||||
}
|
||||
/*
|
||||
PathAttribute{
|
||||
name: "opacity"
|
||||
value: 1
|
||||
}
|
||||
*/
|
||||
|
||||
// Towards Left
|
||||
PathCubic {
|
||||
x: 50
|
||||
y: rootId.height/2
|
||||
|
||||
control1X: rootId.width/2 - rootId.width/8
|
||||
control1Y: rootId.height
|
||||
control2X: 0
|
||||
control2Y: rootId.height/2 + rootId.height/8
|
||||
|
||||
}
|
||||
|
||||
PathAttribute{
|
||||
name: "scale"
|
||||
value: 0.5
|
||||
}
|
||||
/*
|
||||
PathAttribute{
|
||||
name: "opacity"
|
||||
value: 0.5
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
//Towards Top: Q2
|
||||
PathCubic {
|
||||
x: rootId.width/2
|
||||
y: 50
|
||||
control1X: 0
|
||||
control1Y: (rootId.height/2 - rootId.height/8)
|
||||
control2X : (rootId.width/2 - rootId.width/8)
|
||||
control2Y: 0
|
||||
}
|
||||
|
||||
|
||||
PathAttribute{
|
||||
name: "scale"
|
||||
value: 0.3
|
||||
}
|
||||
|
||||
/*
|
||||
PathAttribute{
|
||||
name: "opacity"
|
||||
value: 0.5
|
||||
}
|
||||
*/
|
||||
|
||||
//Towards Right: Q3
|
||||
PathCubic {
|
||||
x: rootId.width - 50
|
||||
y: rootId.height/2
|
||||
control1X: rootId.width/2 + rootId.width/8
|
||||
control1Y: 0
|
||||
control2X: rootId.width
|
||||
control2Y: rootId.height/2 - rootId.height/8
|
||||
}
|
||||
|
||||
|
||||
PathAttribute{
|
||||
name: "scale"
|
||||
value: 0.5
|
||||
}
|
||||
|
||||
/*
|
||||
PathAttribute{
|
||||
name: "opacity"
|
||||
value: 0.5
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
//Towards bottom: Q4
|
||||
PathCubic {
|
||||
x: rootId.width/2
|
||||
y: rootId.height - 50
|
||||
control1X: rootId.width
|
||||
control1Y: rootId.height/2 + rootId.height/8
|
||||
control2X: rootId.width/2 + rootId.width/8
|
||||
control2Y: rootId.height
|
||||
}
|
||||
|
||||
|
||||
PathAttribute{
|
||||
name: "scale";value: 1
|
||||
}
|
||||
|
||||
/*
|
||||
PathAttribute{
|
||||
name: "opacity";value: 0.5
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
Keys.onLeftPressed: decrementCurrentIndex()
|
||||
Keys.onRightPressed: incrementCurrentIndex()
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
// Copyright (c) Daniel Gakwaya.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include <QGuiApplication>
|
||||
#include <QQmlApplicationEngine>
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QGuiApplication app(argc, argv);
|
||||
|
||||
QQmlApplicationEngine engine;
|
||||
QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed,
|
||||
&app, []() { QCoreApplication::exit(-1); },
|
||||
Qt::QueuedConnection);
|
||||
engine.loadFromModule("10-PathView", "Main");
|
||||
|
||||
return app.exec();
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
# Copyright (c) Daniel Gakwaya.
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
|
||||
project(11-TableView VERSION 0.1 LANGUAGES CXX)
|
||||
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
find_package(Qt6 6.5 REQUIRED COMPONENTS Quick QuickControls2)
|
||||
|
||||
qt_standard_project_setup(REQUIRES 6.5)
|
||||
|
||||
qt_add_executable(app11-TableView
|
||||
main.cpp
|
||||
)
|
||||
|
||||
qt_add_qml_module(app11-TableView
|
||||
URI 11-TableView
|
||||
VERSION 1.0
|
||||
QML_FILES Main.qml
|
||||
)
|
||||
|
||||
set_target_properties(app11-TableView PROPERTIES
|
||||
MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
|
||||
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
|
||||
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
|
||||
MACOSX_BUNDLE TRUE
|
||||
WIN32_EXECUTABLE TRUE
|
||||
)
|
||||
|
||||
target_link_libraries(app11-TableView
|
||||
PRIVATE Qt6::Quick Qt6::QuickControls2
|
||||
)
|
||||
|
||||
install(TARGETS app11-TableView
|
||||
BUNDLE DESTINATION .
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
)
|
||||
@@ -0,0 +1,128 @@
|
||||
// Copyright (c) Daniel Gakwaya.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import Qt.labs.qmlmodels
|
||||
|
||||
ApplicationWindow {
|
||||
width: 680
|
||||
height: 400
|
||||
visible: true
|
||||
|
||||
HorizontalHeaderView {
|
||||
id: horizontalHeader
|
||||
anchors.left: tableViewId.left
|
||||
anchors.top: parent.top
|
||||
syncView: tableViewId
|
||||
|
||||
}
|
||||
|
||||
VerticalHeaderView {
|
||||
id: verticalHeader
|
||||
anchors.top: tableViewId.top
|
||||
anchors.left: parent.left
|
||||
syncView: tableViewId
|
||||
}
|
||||
|
||||
|
||||
TableModel {
|
||||
id: tableModelId
|
||||
TableModelColumn { display: "checked" }
|
||||
TableModelColumn { display: "amount" }
|
||||
TableModelColumn { display: "fruitType" }
|
||||
TableModelColumn { display: "fruitName" }
|
||||
TableModelColumn { display: "fruitPrice" }
|
||||
|
||||
// Each row is one type of fruit that can be ordered
|
||||
rows: [
|
||||
{
|
||||
// Each property is one cell/column.
|
||||
checked: false,
|
||||
amount: 1,
|
||||
fruitType: "Apple",
|
||||
fruitName: "Granny Smith",
|
||||
fruitPrice: 1.50
|
||||
},
|
||||
{
|
||||
checked: true,
|
||||
amount: 4,
|
||||
fruitType: "Orange",
|
||||
fruitName: "Navel",
|
||||
fruitPrice: 2.50
|
||||
},
|
||||
{
|
||||
checked: false,
|
||||
amount: 1,
|
||||
fruitType: "Banana",
|
||||
fruitName: "Cavendish",
|
||||
fruitPrice: 3.50
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
TableView {
|
||||
id: tableViewId
|
||||
anchors.left: verticalHeader.right
|
||||
anchors.top: horizontalHeader.bottom
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
|
||||
columnSpacing: 1
|
||||
rowSpacing: 1
|
||||
|
||||
model: tableModelId
|
||||
|
||||
/*
|
||||
delegate: TextInput {
|
||||
text: model.display
|
||||
padding: 12
|
||||
selectByMouse: true
|
||||
|
||||
onAccepted: model.display = text
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
color: "#efefef"
|
||||
z: -1
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
delegate: DelegateChooser {
|
||||
DelegateChoice {
|
||||
column: 0
|
||||
delegate: CheckBox {
|
||||
checked: model.display
|
||||
onToggled: model.display = checked
|
||||
}
|
||||
}
|
||||
DelegateChoice {
|
||||
column: 1
|
||||
delegate: SpinBox {
|
||||
value: model.display
|
||||
onValueModified: model.display = value
|
||||
}
|
||||
}
|
||||
DelegateChoice {
|
||||
delegate: TextField {
|
||||
text: model.display
|
||||
selectByMouse: true
|
||||
implicitWidth: 140
|
||||
onAccepted: model.display = text
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Button{
|
||||
text: "See the data"
|
||||
anchors.bottom: parent.bottom
|
||||
onClicked: {
|
||||
console.log(tableModelId.data(tableModelId.index(0,0),"display"))
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
// Copyright (c) Daniel Gakwaya.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include <QGuiApplication>
|
||||
#include <QQmlApplicationEngine>
|
||||
#include <QQuickStyle>
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QGuiApplication app(argc, argv);
|
||||
|
||||
QQmlApplicationEngine engine;
|
||||
QQuickStyle::setStyle("Material");
|
||||
QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed,
|
||||
&app, []() { QCoreApplication::exit(-1); },
|
||||
Qt::QueuedConnection);
|
||||
engine.loadFromModule("11-TableView", "Main");
|
||||
|
||||
return app.exec();
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
# Copyright (c) Daniel Gakwaya.
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
|
||||
project(12-TableViewCppModel VERSION 0.1 LANGUAGES CXX)
|
||||
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
find_package(Qt6 6.5 REQUIRED COMPONENTS Quick QuickControls2)
|
||||
|
||||
qt_standard_project_setup(REQUIRES 6.5)
|
||||
|
||||
qt_add_executable(app12-TableViewCppModel
|
||||
main.cpp tablemodel.h tablemodel.cpp
|
||||
)
|
||||
|
||||
qt_add_qml_module(app12-TableViewCppModel
|
||||
URI 12-TableViewCppModel
|
||||
VERSION 1.0
|
||||
QML_FILES Main.qml
|
||||
)
|
||||
|
||||
set_target_properties(app12-TableViewCppModel PROPERTIES
|
||||
MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
|
||||
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
|
||||
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
|
||||
MACOSX_BUNDLE TRUE
|
||||
WIN32_EXECUTABLE TRUE
|
||||
)
|
||||
|
||||
target_link_libraries(app12-TableViewCppModel
|
||||
PRIVATE Qt6::Quick Qt6::QuickControls2
|
||||
)
|
||||
|
||||
install(TARGETS app12-TableViewCppModel
|
||||
BUNDLE DESTINATION .
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
)
|
||||
@@ -0,0 +1,68 @@
|
||||
// Copyright (c) Daniel Gakwaya.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import TableModel // Import the custom model from C++
|
||||
|
||||
ApplicationWindow {
|
||||
width: 680
|
||||
height: 400
|
||||
visible: true
|
||||
|
||||
HorizontalHeaderView {
|
||||
id: horizontalHeader
|
||||
anchors.left: tableViewId.left
|
||||
anchors.top: parent.top
|
||||
syncView: tableViewId
|
||||
clip: true
|
||||
|
||||
}
|
||||
|
||||
VerticalHeaderView {
|
||||
id: verticalHeader
|
||||
anchors.top: tableViewId.top
|
||||
anchors.left: parent.left
|
||||
syncView: tableViewId
|
||||
clip: true
|
||||
|
||||
}
|
||||
|
||||
TableModel{
|
||||
id: tableModelId
|
||||
}
|
||||
|
||||
TableView {
|
||||
id: tableViewId
|
||||
anchors.left: verticalHeader.right
|
||||
anchors.top: horizontalHeader.bottom
|
||||
anchors.right: parent.right
|
||||
anchors.bottom: parent.bottom
|
||||
|
||||
columnSpacing: 1
|
||||
rowSpacing: 1
|
||||
boundsBehavior: Flickable.StopAtBounds
|
||||
|
||||
model: tableModelId
|
||||
|
||||
delegate: Label {
|
||||
text: model.tabledata
|
||||
width: 100
|
||||
padding: 12
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
color: "#efefef"
|
||||
z: -1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Button{
|
||||
text: "See the data"
|
||||
anchors.bottom: parent.bottom
|
||||
onClicked: {
|
||||
console.log(tableModelId.get_display_data(tableModelId.index(0,1)))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
// Copyright (c) Daniel Gakwaya.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include <QGuiApplication>
|
||||
#include <QQmlApplicationEngine>
|
||||
#include <QQuickStyle>
|
||||
#include "tablemodel.h"
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QGuiApplication app(argc, argv);
|
||||
|
||||
qmlRegisterType<TableModel>("TableModel", 0, 1, "TableModel");
|
||||
|
||||
QQmlApplicationEngine engine;
|
||||
QQuickStyle::setStyle("Material");
|
||||
QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed,
|
||||
&app, []() { QCoreApplication::exit(-1); },
|
||||
Qt::QueuedConnection);
|
||||
engine.loadFromModule("12-TableViewCppModel", "Main");
|
||||
|
||||
return app.exec();
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
// Copyright (c) Daniel Gakwaya.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "tablemodel.h"
|
||||
|
||||
TableModel::TableModel(QObject *parent) : QAbstractTableModel(parent)
|
||||
{
|
||||
table.append({"Mary","Jane","27","Teacher","Married","Verkso","Tukk"});
|
||||
table.append({"John","Doe","32","Farmer","Single","Gounduana","Mestkv"});
|
||||
table.append({"Mary","Jane","27","Teacher","Married","Verkso","Tukk"});
|
||||
table.append({"John","Doe","32","Farmer","Single","Gounduana","Mestkv"});
|
||||
table.append({"Mary","Jane","27","Teacher","Married","Verkso","Tukk"});
|
||||
table.append({"John","Doe","32","Farmer","Single","Gounduana","Mestkv"});
|
||||
table.append({"Mary","Jane","27","Teacher","Married","Verkso","Tukk"});
|
||||
table.append({"John","Doe","32","Farmer","Single","Gounduana","Mestkv"});
|
||||
table.append({"Mary","Jane","27","Teacher","Married","Verkso","Tukk"});
|
||||
table.append({"John","Doe","32","Farmer","Single","Gounduana","Mestkv"});
|
||||
table.append({"Mary","Jane","27","Teacher","Married","Verkso","Tukk"});
|
||||
table.append({"John","Doe","32","Farmer","Single","Gounduana","Mestkv"});
|
||||
table.append({"Mary","Jane","27","Teacher","Married","Verkso","Tukk"});
|
||||
table.append({"John","Doe","32","Farmer","Single","Gounduana","Mestkv"});
|
||||
table.append({"Mary","Jane","27","Teacher","Married","Verkso","Tukk"});
|
||||
table.append({"John","Doe","32","Farmer","Single","Gounduana","Mestkv"});
|
||||
table.append({"Mary","Jane","27","Teacher","Married","Verkso","Tukk"});
|
||||
table.append({"John","Doe","32","Farmer","Single","Gounduana","Mestkv"});
|
||||
table.append({"Mary","Jane","27","Teacher","Married","Verkso","Tukk"});
|
||||
|
||||
}
|
||||
|
||||
int TableModel::rowCount(const QModelIndex &) const
|
||||
{
|
||||
return table.size();//Number of rows
|
||||
}
|
||||
|
||||
int TableModel::columnCount(const QModelIndex &) const
|
||||
{
|
||||
return table.at(0).size();//Columns
|
||||
}
|
||||
|
||||
QVariant TableModel::data(const QModelIndex &index, int role) const
|
||||
{
|
||||
switch (role) {
|
||||
case TableDataRole:
|
||||
{
|
||||
return table.at(index.row()).at(index.column());
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
QVariant TableModel::headerData(int section, Qt::Orientation orientation, int role) const
|
||||
{
|
||||
if (role != Qt::DisplayRole) {
|
||||
return QVariant();
|
||||
}
|
||||
if (orientation == Qt::Horizontal && section == 0) {
|
||||
return "Name";
|
||||
} else if (orientation == Qt::Horizontal && section == 1) {
|
||||
return "Name";
|
||||
} else if (orientation == Qt::Horizontal && section == 2) {
|
||||
return "Age";
|
||||
} else if (orientation == Qt::Horizontal && section == 3) {
|
||||
return "Job";
|
||||
} else if (orientation == Qt::Horizontal && section == 4) {
|
||||
return "Status";
|
||||
} else if (orientation == Qt::Horizontal && section == 5) {
|
||||
return "Country";
|
||||
} else if (orientation == Qt::Horizontal && section == 6) {
|
||||
return "City";
|
||||
}
|
||||
|
||||
if(orientation == Qt::Vertical){
|
||||
return QVariant::fromValue(section + 1) ;
|
||||
}
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
QHash<int, QByteArray> TableModel::roleNames() const
|
||||
{
|
||||
QHash<int, QByteArray> roles;
|
||||
roles[TableDataRole] = "tabledata";
|
||||
return roles;
|
||||
}
|
||||
|
||||
QVariant TableModel::get_display_data(const QModelIndex &index){
|
||||
return data(index,TableDataRole );
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
// Copyright (c) Daniel Gakwaya.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef TABLEMODEL_H
|
||||
#define TABLEMODEL_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QAbstractTableModel>
|
||||
|
||||
class TableModel : public QAbstractTableModel
|
||||
{
|
||||
Q_OBJECT
|
||||
enum TableRoles{
|
||||
TableDataRole = Qt::UserRole + 1,
|
||||
};
|
||||
public:
|
||||
explicit TableModel(QObject *parent = nullptr);
|
||||
int rowCount(const QModelIndex & = QModelIndex()) const override;
|
||||
int columnCount(const QModelIndex & = QModelIndex()) const override;
|
||||
QVariant data(const QModelIndex &index, int role) const override;
|
||||
QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
|
||||
QHash<int, QByteArray> roleNames() const override;
|
||||
|
||||
Q_INVOKABLE
|
||||
QVariant get_display_data(const QModelIndex& index);
|
||||
|
||||
private:
|
||||
QVector<QVector<QString>> table;
|
||||
};
|
||||
|
||||
#endif // TABLEMODEL_H
|
||||
@@ -0,0 +1,5 @@
|
||||
[General]
|
||||
buildDir="D:/Sandbox/Qt6QMLBeginnersCode/11-ModelViewArchitecture/14-TodoListModelView/build"
|
||||
no-cmake-calls=false
|
||||
docDir=C:/Qt/Docs/Qt-6.9.0
|
||||
importPaths="C:/Qt/6.9.0/mingw_64/qml"
|
||||
@@ -0,0 +1,52 @@
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
|
||||
project(TodoList VERSION 0.1 LANGUAGES CXX)
|
||||
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
find_package(Qt6 REQUIRED COMPONENTS Quick QuickControls2)
|
||||
|
||||
qt_standard_project_setup(REQUIRES 6.8)
|
||||
|
||||
qt_add_executable(TodoList
|
||||
src/main.cpp
|
||||
)
|
||||
|
||||
qt_add_qml_module(TodoList
|
||||
URI TodoList
|
||||
VERSION 1.0
|
||||
QML_FILES
|
||||
# Main View
|
||||
src/views/MainView.qml
|
||||
|
||||
# Components
|
||||
src/components/AppHeader.qml
|
||||
src/components/AddTaskBar.qml
|
||||
src/components/TaskItem.qml
|
||||
src/components/TaskStats.qml
|
||||
|
||||
# Models
|
||||
src/models/TaskListModel.qml
|
||||
)
|
||||
|
||||
# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
|
||||
# If you are developing for iOS or macOS you should consider setting an
|
||||
# explicit, fixed bundle identifier manually though.
|
||||
set_target_properties(TodoList PROPERTIES
|
||||
# MACOSX_BUNDLE_GUI_IDENTIFIER com.example.app01_todolist_starter
|
||||
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
|
||||
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
|
||||
MACOSX_BUNDLE TRUE
|
||||
WIN32_EXECUTABLE TRUE
|
||||
)
|
||||
|
||||
target_link_libraries(TodoList
|
||||
PRIVATE Qt6::Quick Qt6::QuickControls2
|
||||
)
|
||||
|
||||
include(GNUInstallDirs)
|
||||
install(TARGETS TodoList
|
||||
BUNDLE DESTINATION .
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
)
|
||||
@@ -0,0 +1,110 @@
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
|
||||
Item {
|
||||
id: root
|
||||
height: 60
|
||||
|
||||
signal taskAdded(string taskText)
|
||||
|
||||
property color backgroundColor: "#ffffff"
|
||||
property color textColor: "#333333"
|
||||
property color primaryColor: "#007aff"
|
||||
property bool darkMode: false
|
||||
|
||||
Rectangle {
|
||||
id: background
|
||||
anchors.fill: parent
|
||||
color: "transparent"
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
color: root.backgroundColor
|
||||
radius: 12
|
||||
border.color: root.darkMode ? "#404040" : "#e0e0e0"
|
||||
border.width: 1
|
||||
|
||||
RowLayout {
|
||||
anchors.fill: parent
|
||||
anchors.margins: 12
|
||||
spacing: 12
|
||||
|
||||
// Add icon
|
||||
Rectangle {
|
||||
Layout.preferredWidth: 36
|
||||
Layout.preferredHeight: 36
|
||||
color: root.primaryColor
|
||||
radius: 18
|
||||
|
||||
Text {
|
||||
anchors.centerIn: parent
|
||||
text: "+"
|
||||
color: "#ffffff"
|
||||
font.pixelSize: 20
|
||||
font.weight: Font.Bold
|
||||
}
|
||||
}
|
||||
|
||||
// Text input
|
||||
TextField {
|
||||
id: taskInput
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: 36
|
||||
placeholderText: qsTr("Add a new task...")
|
||||
placeholderTextColor: root.darkMode ? "#888888" : "#999999"
|
||||
color: root.textColor
|
||||
font.pixelSize: 16
|
||||
selectByMouse: true
|
||||
|
||||
background: Rectangle {
|
||||
color: "transparent"
|
||||
border.color: "transparent"
|
||||
}
|
||||
|
||||
Keys.onReturnPressed: root.addTask()
|
||||
Keys.onEnterPressed: root.addTask()
|
||||
|
||||
}
|
||||
|
||||
// Add button
|
||||
Button {
|
||||
id: addButton
|
||||
Layout.preferredWidth: 80
|
||||
Layout.preferredHeight: 36
|
||||
text: qsTr("Add")
|
||||
enabled: taskInput.text.trim().length > 0
|
||||
|
||||
background: Rectangle {
|
||||
color: addButton.enabled ?
|
||||
(addButton.pressed ? Qt.darker(root.primaryColor, 1.2) : root.primaryColor) :
|
||||
(root.darkMode ? "#404040" : "#e0e0e0")
|
||||
radius: 8
|
||||
|
||||
}
|
||||
|
||||
contentItem: Text {
|
||||
text: addButton.text
|
||||
color: addButton.enabled ? "#ffffff" : (root.darkMode ? "#888888" : "#cccccc")
|
||||
font.pixelSize: 14
|
||||
font.weight: Font.Medium
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
|
||||
}
|
||||
|
||||
onClicked: root.addTask()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function addTask() {
|
||||
if (taskInput.text.trim().length > 0) {
|
||||
root.taskAdded(taskInput.text.trim())
|
||||
taskInput.text = ""
|
||||
taskInput.focus = false
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
|
||||
Item {
|
||||
id: root
|
||||
height: 80
|
||||
|
||||
signal toggleDarkMode()
|
||||
|
||||
// Properties that will be bound from parent
|
||||
property color textColor: "#333333"
|
||||
property color textSecondary: "#999999"
|
||||
property bool darkMode: false
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
color: "transparent"
|
||||
|
||||
RowLayout{
|
||||
anchors.fill: parent
|
||||
anchors.leftMargin: 8
|
||||
anchors.rightMargin: 8
|
||||
spacing: 12
|
||||
|
||||
// App icon
|
||||
Text {
|
||||
text: "📝"
|
||||
font.pixelSize: 32
|
||||
}
|
||||
|
||||
// App title and subtitle
|
||||
Column {
|
||||
Layout.fillWidth: true
|
||||
spacing: 2
|
||||
|
||||
Text {
|
||||
text: "My Tasks"
|
||||
font.pixelSize: 28
|
||||
font.weight: Font.Bold
|
||||
color: root.textColor
|
||||
}
|
||||
|
||||
Text {
|
||||
text: qsTr("Stay organized, stay productive")
|
||||
font.pixelSize: 12
|
||||
color: root.textSecondary
|
||||
opacity: 0.8
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Dark mode toggle
|
||||
Button {
|
||||
id: themeToggle
|
||||
Layout.preferredWidth: 50
|
||||
Layout.preferredHeight: 50
|
||||
|
||||
background: Rectangle {
|
||||
color: themeToggle.pressed ?
|
||||
(root.darkMode ? "#404040" : "#e0e0e0") :
|
||||
(root.darkMode ? "#2d2d2d" : "#f5f5f5")
|
||||
radius: 25
|
||||
border.color: root.darkMode ? "#555555" : "#d0d0d0"
|
||||
border.width: 1
|
||||
|
||||
Behavior on color {
|
||||
ColorAnimation { duration: 150 }
|
||||
}
|
||||
}
|
||||
|
||||
contentItem: Text{
|
||||
text: root.darkMode ? "☀️" : "🌙"
|
||||
font.pixelSize: 20
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
|
||||
//Emit the signal when the button is clicked
|
||||
onClicked: root.toggleDarkMode()
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,129 @@
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
|
||||
Item {
|
||||
id: root
|
||||
height: 56
|
||||
|
||||
required property string taskTitle
|
||||
required property bool taskDone
|
||||
|
||||
signal toggleDone()
|
||||
signal deleteTask()
|
||||
|
||||
property color backgroundColor: "#ffffff"
|
||||
property color textColor: "#333333"
|
||||
property color completedColor: "#999999"
|
||||
property color primaryColor: "#007aff"
|
||||
property bool darkMode: false
|
||||
|
||||
// Constants for this component
|
||||
readonly property int itemHeight: 56
|
||||
readonly property int margins: 4
|
||||
readonly property int innerMargins: 12
|
||||
readonly property int checkboxSize: 24
|
||||
readonly property int deleteButtonSize: 32
|
||||
|
||||
Rectangle {
|
||||
id: taskItemBackground
|
||||
anchors.fill: parent
|
||||
color: "transparent"
|
||||
|
||||
Rectangle {
|
||||
id: itemBackground
|
||||
anchors.fill: parent
|
||||
anchors.margins: root.margins
|
||||
color: root.backgroundColor
|
||||
radius: 8
|
||||
border.color: root.taskDone ? "transparent" : (root.darkMode ? "#404040" : "#f0f0f0")
|
||||
border.width: 1
|
||||
opacity: root.taskDone ? 0.7 : 1.0
|
||||
|
||||
RowLayout {
|
||||
anchors.fill: parent
|
||||
anchors.margins: root.innerMargins
|
||||
spacing: 12
|
||||
|
||||
// Checkbox
|
||||
Rectangle {
|
||||
id: checkbox
|
||||
Layout.preferredWidth: root.checkboxSize
|
||||
Layout.preferredHeight: root.checkboxSize
|
||||
color: root.taskDone ? root.primaryColor : "transparent"
|
||||
border.color: root.taskDone ? root.primaryColor : (root.darkMode ? "#666666" : "#cccccc")
|
||||
border.width: 2
|
||||
radius: 4
|
||||
|
||||
// Checkmark
|
||||
Text {
|
||||
anchors.centerIn: parent
|
||||
text: "✓"
|
||||
color: "#ffffff"
|
||||
font.pixelSize: 16
|
||||
font.weight: Font.Bold
|
||||
opacity: root.taskDone ? 1.0 : 0.0
|
||||
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
root.toggleDone()
|
||||
}
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Task text
|
||||
Text {
|
||||
id: taskText
|
||||
Layout.fillWidth: true
|
||||
text: root.taskTitle
|
||||
color: root.taskDone ? root.completedColor : root.textColor
|
||||
font.pixelSize: 16
|
||||
font.strikeout: root.taskDone
|
||||
wrapMode: Text.WordWrap
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: root.toggleDone()
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
}
|
||||
}
|
||||
|
||||
// Delete button
|
||||
Button {
|
||||
id: deleteButton
|
||||
Layout.preferredWidth: root.deleteButtonSize
|
||||
Layout.preferredHeight: root.deleteButtonSize
|
||||
opacity: itemBackground.hovered ? 1.0 : 0.3
|
||||
|
||||
background: Rectangle {
|
||||
color: deleteButton.pressed ? "#ff3b30" : "transparent"
|
||||
radius: 16
|
||||
}
|
||||
|
||||
contentItem: Text {
|
||||
text: "🗑"
|
||||
font.pixelSize: 16
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
|
||||
onClicked: {
|
||||
root.deleteTask()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Hover effect
|
||||
property bool hovered: false
|
||||
|
||||
HoverHandler {
|
||||
onHoveredChanged: itemBackground.hovered = hovered
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
|
||||
Item {
|
||||
id: root
|
||||
height: visible ? 60 : 0
|
||||
visible: totalTasks > 0
|
||||
|
||||
property int totalTasks: 0
|
||||
property int completedTasks: 0
|
||||
property int remainingTasks: 0
|
||||
property bool hasCompleted: false
|
||||
|
||||
property color backgroundColor: "#ffffff"
|
||||
property color textColor: "#333333"
|
||||
property color secondaryTextColor: "#666666"
|
||||
property color primaryColor: "#007aff"
|
||||
property color dangerColor: "#ff3b30"
|
||||
property bool darkMode: false
|
||||
|
||||
signal clearCompleted()
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
color: "transparent"
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
color: root.backgroundColor
|
||||
radius: 12
|
||||
border.color: root.darkMode ? "#404040" : "#e0e0e0"
|
||||
border.width: 1
|
||||
|
||||
RowLayout {
|
||||
anchors.fill: parent
|
||||
anchors.margins: 16
|
||||
spacing: 16
|
||||
|
||||
// Statistics text
|
||||
Column {
|
||||
Layout.fillWidth: true
|
||||
spacing: 2
|
||||
|
||||
Text {
|
||||
text: root.totalTasks === 1 ?
|
||||
qsTr("%1 task").arg(root.totalTasks) :
|
||||
qsTr("%1 tasks").arg(root.totalTasks)
|
||||
color: root.textColor
|
||||
font.pixelSize: 16
|
||||
font.weight: Font.Medium
|
||||
}
|
||||
|
||||
Text {
|
||||
text: root.completedTasks > 0 ?
|
||||
qsTr("%1 completed, %2 remaining").arg(root.completedTasks).arg(root.remainingTasks) :
|
||||
qsTr("No tasks completed yet")
|
||||
color: root.secondaryTextColor
|
||||
font.pixelSize: 14
|
||||
visible: root.totalTasks > 0
|
||||
}
|
||||
}
|
||||
|
||||
// Clear completed button
|
||||
Button {
|
||||
id: clearButton
|
||||
Layout.preferredHeight: 36
|
||||
text: qsTr("Clear Completed")
|
||||
visible: root.hasCompleted
|
||||
enabled: root.hasCompleted
|
||||
|
||||
background: Rectangle {
|
||||
color: clearButton.pressed ?
|
||||
Qt.darker(root.dangerColor, 1.2) :
|
||||
(clearButton.hovered ? root.dangerColor : "transparent")
|
||||
border.color: root.dangerColor
|
||||
border.width: 1
|
||||
radius: 8
|
||||
}
|
||||
|
||||
contentItem: Text {
|
||||
text: clearButton.text
|
||||
color: clearButton.hovered ? "#ffffff" : root.dangerColor
|
||||
font.pixelSize: 14
|
||||
font.weight: Font.Medium
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
}
|
||||
|
||||
onClicked: root.clearCompleted()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
#include <QGuiApplication>
|
||||
#include <QQmlApplicationEngine>
|
||||
#include <QQuickStyle>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QGuiApplication app(argc, argv);
|
||||
|
||||
// Set Qt Quick Controls style to Basic to enable customization
|
||||
QQuickStyle::setStyle("Basic");
|
||||
|
||||
QQmlApplicationEngine engine;
|
||||
QObject::connect(
|
||||
&engine,
|
||||
&QQmlApplicationEngine::objectCreationFailed,
|
||||
&app,
|
||||
[]() { QCoreApplication::exit(-1); },
|
||||
Qt::QueuedConnection);
|
||||
engine.loadFromModule("TodoList", "MainView");
|
||||
|
||||
return app.exec();
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
import QtQuick
|
||||
|
||||
ListModel {
|
||||
id: root
|
||||
|
||||
// Add some sample tasks for testing
|
||||
Component.onCompleted: {
|
||||
addTask("Learn Qt QML")
|
||||
addTask("Build a todo app")
|
||||
addTask("Practice QML components")
|
||||
}
|
||||
|
||||
// Add a new task
|
||||
function addTask(title) {
|
||||
if (title && title.trim().length > 0) {
|
||||
append({
|
||||
"title": title.trim(),
|
||||
"completed": false,
|
||||
"id": generateId()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// Toggle task completion status
|
||||
function toggleTask(index) {
|
||||
if (index >= 0 && index < count) {
|
||||
setProperty(index, "completed", !get(index).completed)
|
||||
}
|
||||
}
|
||||
|
||||
// Delete a task
|
||||
function deleteTask(index) {
|
||||
if (index >= 0 && index < count) {
|
||||
remove(index)
|
||||
}
|
||||
}
|
||||
|
||||
// Delete task by ID
|
||||
function deleteTaskById(taskId) {
|
||||
for (let i = 0; i < count; i++) {
|
||||
if (get(i).id === taskId) {
|
||||
remove(i)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Clear all completed tasks
|
||||
function clearCompletedTasks() {
|
||||
for (let i = count - 1; i >= 0; i--) {
|
||||
if (get(i).completed) {
|
||||
remove(i)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Get statistics
|
||||
function getStats() {
|
||||
let total = count
|
||||
let completed = 0
|
||||
|
||||
for (let i = 0; i < count; i++) {
|
||||
if (get(i).completed) {
|
||||
completed++
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
"total": total,
|
||||
"completed": completed,
|
||||
"remaining": total - completed
|
||||
}
|
||||
}
|
||||
|
||||
// Check if there are any completed tasks
|
||||
function hasCompletedTasks() {
|
||||
for (let i = 0; i < count; i++) {
|
||||
if (get(i).completed) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// Generate a unique ID for tasks
|
||||
function generateId() {
|
||||
return Date.now() + Math.random().toString(36).substr(2, 9)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,165 @@
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
|
||||
ApplicationWindow {
|
||||
id: root
|
||||
width: 400
|
||||
height: 700
|
||||
visible: true
|
||||
title: qsTr("My Tasks")
|
||||
|
||||
// Theme properties
|
||||
property bool darkMode: false
|
||||
property color backgroundColor: darkMode ? "#1e1e1e" : "#f0f2f5"
|
||||
property color primaryColor: "#007aff"
|
||||
property color textColor: darkMode ? "#ffffff" : "#333333"
|
||||
property color cardColor: darkMode ? "#2d2d2d" : "#ffffff"
|
||||
property color completedColor: darkMode ? "#666666" : "#999999"
|
||||
|
||||
// Task model - Using the dedicated TaskListModel
|
||||
TaskListModel {
|
||||
id: taskModel
|
||||
}
|
||||
|
||||
// Background
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
color: root.backgroundColor
|
||||
}
|
||||
|
||||
//The components of the ui
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
anchors.margins: 20
|
||||
spacing: 20
|
||||
|
||||
// Header
|
||||
AppHeader {
|
||||
id: header
|
||||
Layout.fillWidth: true
|
||||
textColor: root.textColor
|
||||
textSecondary: root.completedColor
|
||||
darkMode: root.darkMode
|
||||
onToggleDarkMode: root.darkMode = !root.darkMode
|
||||
}
|
||||
|
||||
// Add task bar
|
||||
AddTaskBar {
|
||||
id: addTaskBar
|
||||
Layout.fillWidth: true
|
||||
backgroundColor: root.cardColor
|
||||
textColor: root.textColor
|
||||
primaryColor: root.primaryColor
|
||||
darkMode: root.darkMode
|
||||
|
||||
onTaskAdded: function(taskText) {
|
||||
taskModel.addTask(taskText)
|
||||
}
|
||||
}
|
||||
|
||||
// Tasks list
|
||||
Rectangle {
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
color: root.cardColor
|
||||
radius: 12
|
||||
border.width: 1
|
||||
border.color: root.darkMode ? "#404040" : "#e0e0e0"
|
||||
|
||||
ScrollView {
|
||||
anchors.fill: parent
|
||||
anchors.margins: 1
|
||||
clip: true
|
||||
|
||||
ListView {
|
||||
id: taskListView
|
||||
model: taskModel
|
||||
spacing: 8
|
||||
anchors.margins: 12
|
||||
|
||||
delegate: TaskItem {
|
||||
required property int index
|
||||
required property string title
|
||||
required property bool completed
|
||||
|
||||
width: taskListView.width
|
||||
taskTitle: title
|
||||
taskDone: completed
|
||||
backgroundColor: root.cardColor
|
||||
textColor: root.textColor
|
||||
completedColor: root.completedColor
|
||||
primaryColor: root.primaryColor
|
||||
darkMode: root.darkMode
|
||||
|
||||
onToggleDone: {
|
||||
taskModel.toggleTask(index)
|
||||
}
|
||||
|
||||
onDeleteTask: {
|
||||
taskModel.deleteTask(index)
|
||||
}
|
||||
}
|
||||
|
||||
// Empty state
|
||||
Rectangle {
|
||||
anchors.centerIn: parent
|
||||
width: parent.width - 40
|
||||
height: 120
|
||||
color: "transparent"
|
||||
visible: taskListView.count === 0
|
||||
|
||||
Column {
|
||||
anchors.centerIn: parent
|
||||
spacing: 16
|
||||
|
||||
Text {
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
text: "📝"
|
||||
font.pixelSize: 48
|
||||
opacity: 0.3
|
||||
}
|
||||
|
||||
Text {
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
text: qsTr("No tasks yet")
|
||||
color: root.completedColor
|
||||
font.pixelSize: 18
|
||||
font.weight: Font.Medium
|
||||
}
|
||||
|
||||
Text {
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
text: qsTr("Add a task above to get started")
|
||||
color: root.completedColor
|
||||
font.pixelSize: 14
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
// Task statistics at bottom
|
||||
TaskStats {
|
||||
id: taskStats
|
||||
Layout.fillWidth: true
|
||||
backgroundColor: root.cardColor
|
||||
textColor: root.textColor
|
||||
secondaryTextColor: root.completedColor
|
||||
primaryColor: root.primaryColor
|
||||
darkMode: root.darkMode
|
||||
totalTasks: taskModel.count
|
||||
completedTasks: taskModel.getStats().completed
|
||||
remainingTasks: taskModel.getStats().remaining
|
||||
hasCompleted: taskModel.hasCompletedTasks()
|
||||
|
||||
onClearCompleted: {
|
||||
taskModel.clearCompletedTasks()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
# Copyright (c) Daniel Gakwaya.
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
|
||||
project(2-ListViewListModel VERSION 0.1 LANGUAGES CXX)
|
||||
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
find_package(Qt6 6.5 REQUIRED COMPONENTS Quick)
|
||||
|
||||
qt_standard_project_setup(REQUIRES 6.5)
|
||||
|
||||
qt_add_executable(app2-ListViewListModel
|
||||
main.cpp
|
||||
)
|
||||
|
||||
qt_add_qml_module(app2-ListViewListModel
|
||||
URI ListViewListModel
|
||||
VERSION 1.0
|
||||
QML_FILES Main.qml
|
||||
)
|
||||
|
||||
set_target_properties(app2-ListViewListModel PROPERTIES
|
||||
MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
|
||||
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
|
||||
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
|
||||
MACOSX_BUNDLE TRUE
|
||||
WIN32_EXECUTABLE TRUE
|
||||
)
|
||||
|
||||
target_link_libraries(app2-ListViewListModel
|
||||
PRIVATE Qt6::Quick
|
||||
)
|
||||
|
||||
install(TARGETS app2-ListViewListModel
|
||||
BUNDLE DESTINATION .
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
)
|
||||
@@ -0,0 +1,103 @@
|
||||
// Copyright (c) Daniel Gakwaya.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
import QtQuick
|
||||
import QtQuick.Window
|
||||
|
||||
Window {
|
||||
visible: true
|
||||
width: 640
|
||||
height: 480
|
||||
title: qsTr("ListView and ListModel Demo")
|
||||
|
||||
ListView {
|
||||
id: mListViewId
|
||||
anchors.fill: parent
|
||||
model: mModelId
|
||||
//delegate: delegateId
|
||||
|
||||
|
||||
delegate: Rectangle {
|
||||
id: rectangleId
|
||||
width: parent.width
|
||||
height: 50
|
||||
color: "beige"
|
||||
border.color: "yellowgreen"
|
||||
radius: 10
|
||||
|
||||
Text {
|
||||
id: textId
|
||||
anchors.centerIn: parent
|
||||
font.pointSize: 20
|
||||
text: country + " : " + capital
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
console.log("Clicked on: "+ capital + ", "+ country)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
ListModel {
|
||||
id: mModelId
|
||||
ListElement {
|
||||
country: "Rwanda"
|
||||
capital: "Kigali"
|
||||
}
|
||||
ListElement {
|
||||
country: "Germany"; capital: "Berlin"
|
||||
}
|
||||
ListElement {
|
||||
country: "Japan"; capital: "Tokyo"
|
||||
}
|
||||
|
||||
ListElement {
|
||||
country :"Nigeria"; capital: "Lagos"
|
||||
}
|
||||
ListElement {
|
||||
country: "Ghana"; capital: "Accra"
|
||||
}
|
||||
ListElement {
|
||||
country: "Kenya"; capital: "Nairobi"
|
||||
}
|
||||
ListElement {
|
||||
country: "India"; capital: "New Delhi"
|
||||
}
|
||||
ListElement {
|
||||
country: "Uganda"; capital: "Kampala"
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Component {
|
||||
id: delegateId
|
||||
Rectangle {
|
||||
id: rectangleId
|
||||
width: parent.width
|
||||
height: 50
|
||||
color: "dodgerblue"
|
||||
border.color: "black"
|
||||
radius: 15
|
||||
|
||||
Text {
|
||||
id: textId
|
||||
anchors.centerIn: parent
|
||||
font.pointSize: 20
|
||||
text: country + ": " + capital
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
console.log("Clicked on: "+ capital + ", "+ country)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
// Copyright (c) Daniel Gakwaya.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include <QGuiApplication>
|
||||
#include <QQmlApplicationEngine>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
|
||||
QGuiApplication app(argc, argv);
|
||||
|
||||
QQmlApplicationEngine engine;
|
||||
QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed,
|
||||
&app, []() { QCoreApplication::exit(-1); },
|
||||
Qt::QueuedConnection);
|
||||
engine.loadFromModule("ListViewListModel", "Main");
|
||||
|
||||
return app.exec();
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
# Copyright (c) Daniel Gakwaya.
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
|
||||
project(3-InlineModels VERSION 0.1 LANGUAGES CXX)
|
||||
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
find_package(Qt6 6.5 REQUIRED COMPONENTS Quick)
|
||||
|
||||
qt_standard_project_setup(REQUIRES 6.5)
|
||||
|
||||
qt_add_executable(app3-InlineModels
|
||||
main.cpp
|
||||
)
|
||||
|
||||
qt_add_qml_module(app3-InlineModels
|
||||
URI 3-InlineModels
|
||||
VERSION 1.0
|
||||
QML_FILES Main.qml
|
||||
)
|
||||
|
||||
set_target_properties(app3-InlineModels PROPERTIES
|
||||
MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
|
||||
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
|
||||
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
|
||||
MACOSX_BUNDLE TRUE
|
||||
WIN32_EXECUTABLE TRUE
|
||||
)
|
||||
|
||||
target_link_libraries(app3-InlineModels
|
||||
PRIVATE Qt6::Quick
|
||||
)
|
||||
|
||||
install(TARGETS app3-InlineModels
|
||||
BUNDLE DESTINATION .
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
)
|
||||
@@ -0,0 +1,43 @@
|
||||
// Copyright (c) Daniel Gakwaya.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
import QtQuick
|
||||
import QtQuick.Window
|
||||
|
||||
Window {
|
||||
id: rootId
|
||||
visible: true
|
||||
width: 640
|
||||
height: 480
|
||||
title: qsTr("Inline Model")
|
||||
|
||||
|
||||
ListView {
|
||||
id: mListViewId
|
||||
anchors.fill: parent
|
||||
//model : ["January", "February", "March", "April", "May", "June", "July", "Aug", "Sept", "Oct", "Nov", "Dec"]
|
||||
model: 100
|
||||
delegate: Rectangle {
|
||||
id: rectangleId
|
||||
width: rootId.width
|
||||
height: 50
|
||||
color: "beige"
|
||||
border.color: "yellowgreen"
|
||||
radius: 10
|
||||
|
||||
Text {
|
||||
id: textId
|
||||
anchors.centerIn: parent
|
||||
font.pointSize: 20
|
||||
text: modelData
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
console.log("Clicked on: "+ modelData)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
// Copyright (c) Daniel Gakwaya.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include <QGuiApplication>
|
||||
#include <QQmlApplicationEngine>
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
|
||||
QGuiApplication app(argc, argv);
|
||||
|
||||
QQmlApplicationEngine engine;
|
||||
QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed,
|
||||
&app, []() { QCoreApplication::exit(-1); },
|
||||
Qt::QueuedConnection);
|
||||
engine.loadFromModule("3-InlineModels", "Main");
|
||||
|
||||
return app.exec();
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
# Copyright (c) Daniel Gakwaya.
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
|
||||
project(4-HeaderFooterHighlight VERSION 0.1 LANGUAGES CXX)
|
||||
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
find_package(Qt6 6.5 REQUIRED COMPONENTS Quick)
|
||||
|
||||
qt_standard_project_setup(REQUIRES 6.5)
|
||||
|
||||
qt_add_executable(app4-HeaderFooterHighlight
|
||||
main.cpp
|
||||
)
|
||||
|
||||
qt_add_qml_module(app4-HeaderFooterHighlight
|
||||
URI 4-HeaderFooterHighlight
|
||||
VERSION 1.0
|
||||
QML_FILES Main.qml
|
||||
)
|
||||
|
||||
set_target_properties(app4-HeaderFooterHighlight PROPERTIES
|
||||
MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
|
||||
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
|
||||
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
|
||||
MACOSX_BUNDLE TRUE
|
||||
WIN32_EXECUTABLE TRUE
|
||||
)
|
||||
|
||||
target_link_libraries(app4-HeaderFooterHighlight
|
||||
PRIVATE Qt6::Quick
|
||||
)
|
||||
|
||||
install(TARGETS app4-HeaderFooterHighlight
|
||||
BUNDLE DESTINATION .
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
)
|
||||
@@ -0,0 +1,75 @@
|
||||
// Copyright (c) Daniel Gakwaya.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
import QtQuick
|
||||
import QtQuick.Window
|
||||
|
||||
Window {
|
||||
id: rootId
|
||||
visible: true
|
||||
width: 640
|
||||
height: 480
|
||||
title: qsTr("Header Footer and Highlight")
|
||||
|
||||
ListView {
|
||||
id: mListViewId
|
||||
anchors.fill: parent
|
||||
header: headerId
|
||||
footer: Rectangle{
|
||||
width: rootId.width
|
||||
height: 50
|
||||
color: "dodgerblue"
|
||||
}
|
||||
highlight: Rectangle{
|
||||
width: rootId.width
|
||||
color: "blue"
|
||||
radius: 14
|
||||
border.color: "yellowgreen"
|
||||
z: 3
|
||||
opacity: 0.1
|
||||
}
|
||||
|
||||
model: ["January", "February", "March", "April", "May", "June", "July", "Aug", "Sept", "Oct", "Nov", "Dec"]
|
||||
delegate: Rectangle {
|
||||
id: delegateId
|
||||
width: rootId.width
|
||||
height: 50
|
||||
color: "beige"
|
||||
border.color: "yellowgreen"
|
||||
radius: 10
|
||||
|
||||
Text {
|
||||
id: textId
|
||||
anchors.centerIn: parent
|
||||
font.pointSize: 20
|
||||
text : modelData
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
console.log("Clicked on: "+ modelData)
|
||||
mListViewId.currentIndex = index
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Component {
|
||||
id: headerId
|
||||
Rectangle {
|
||||
id: headerRectId
|
||||
width: rootId.width
|
||||
height: 50
|
||||
color: "yellowgreen"
|
||||
border {color: "#9EDDF2"; width: 2}
|
||||
|
||||
Text {
|
||||
anchors.centerIn: parent
|
||||
text: "Months"
|
||||
font.pointSize: 20
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
// Copyright (c) Daniel Gakwaya.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include <QGuiApplication>
|
||||
#include <QQmlApplicationEngine>
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
|
||||
QGuiApplication app(argc, argv);
|
||||
|
||||
QQmlApplicationEngine engine;
|
||||
QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed,
|
||||
&app, []() { QCoreApplication::exit(-1); },
|
||||
Qt::QueuedConnection);
|
||||
engine.loadFromModule("4-HeaderFooterHighlight", "Main");
|
||||
|
||||
return app.exec();
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
# Copyright (c) Daniel Gakwaya.
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
|
||||
project(5-DecorationSection VERSION 0.1 LANGUAGES CXX)
|
||||
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
find_package(Qt6 6.5 REQUIRED COMPONENTS Quick)
|
||||
|
||||
qt_standard_project_setup(REQUIRES 6.5)
|
||||
|
||||
qt_add_executable(app5-DecorationSection
|
||||
main.cpp
|
||||
)
|
||||
|
||||
qt_add_qml_module(app5-DecorationSection
|
||||
URI 5-DecorationSection
|
||||
VERSION 1.0
|
||||
QML_FILES Main.qml
|
||||
)
|
||||
|
||||
set_target_properties(app5-DecorationSection PROPERTIES
|
||||
MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
|
||||
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
|
||||
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
|
||||
MACOSX_BUNDLE TRUE
|
||||
WIN32_EXECUTABLE TRUE
|
||||
)
|
||||
|
||||
target_link_libraries(app5-DecorationSection
|
||||
PRIVATE Qt6::Quick
|
||||
)
|
||||
|
||||
install(TARGETS app5-DecorationSection
|
||||
BUNDLE DESTINATION .
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
)
|
||||
@@ -0,0 +1,106 @@
|
||||
// Copyright (c) Daniel Gakwaya.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
import QtQuick
|
||||
import QtQuick.Window
|
||||
|
||||
Window {
|
||||
visible: true
|
||||
width: 640
|
||||
height: 480
|
||||
title: qsTr("Section (Decoration)")
|
||||
|
||||
|
||||
ListModel {
|
||||
id: mListModel
|
||||
|
||||
ListElement {
|
||||
names: "Seth Moris"; company: "GOOGLE"
|
||||
}
|
||||
ListElement {
|
||||
names: "Miriam Katv"; company: "GOOGLE"
|
||||
}
|
||||
|
||||
ListElement {
|
||||
names: "Eugene Fitzgerald"; company: "GOOGLE"
|
||||
}
|
||||
ListElement {
|
||||
names: "Kantkl Vikney"; company : "GOOGLE"
|
||||
}
|
||||
ListElement {
|
||||
names: "Mary Beige"; company: "TESLA"
|
||||
}
|
||||
ListElement {
|
||||
names: "Bamba Pikt"; company: "TESLA"
|
||||
}
|
||||
ListElement {
|
||||
names: "Jeffery Mor"; company: "SIEMENS"
|
||||
}
|
||||
ListElement {
|
||||
names: "Pick Mo"; company: "SIEMENS"
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
ListView {
|
||||
id: mListViewId
|
||||
anchors.fill: parent
|
||||
model : mListModel
|
||||
delegate: delegateId
|
||||
section {
|
||||
property: "company"
|
||||
criteria: ViewSection.FullString
|
||||
delegate: Rectangle{
|
||||
id: sectionRectId
|
||||
width : parent.width
|
||||
height: 50
|
||||
color: "red"
|
||||
border.color: "yellowgreen"
|
||||
radius: 14
|
||||
|
||||
Text {
|
||||
id: sectionTextId
|
||||
text : section
|
||||
anchors.centerIn: parent
|
||||
font.pointSize: 20
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
console.log("Clicked on: " + section)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Component {
|
||||
id: delegateId
|
||||
Rectangle {
|
||||
id: rectangleId
|
||||
width : parent.width // Remember to specify these sizes or you'll have problems
|
||||
height: 50
|
||||
color: "beige"
|
||||
border.color: "yellowgreen"
|
||||
radius: 14
|
||||
|
||||
Text {
|
||||
id: textId
|
||||
anchors.centerIn: parent
|
||||
text: names
|
||||
font.pointSize: 20
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
console.log("Clicked on: " + names)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
// Copyright (c) Daniel Gakwaya.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include <QGuiApplication>
|
||||
#include <QQmlApplicationEngine>
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
|
||||
QGuiApplication app(argc, argv);
|
||||
|
||||
QQmlApplicationEngine engine;
|
||||
QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed,
|
||||
&app, []() { QCoreApplication::exit(-1); },
|
||||
Qt::QueuedConnection);
|
||||
engine.loadFromModule("5-DecorationSection", "Main");
|
||||
|
||||
return app.exec();
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
# Copyright (c) Daniel Gakwaya.
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
|
||||
project(6-Repeater VERSION 0.1 LANGUAGES CXX)
|
||||
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
find_package(Qt6 6.5 REQUIRED COMPONENTS Quick)
|
||||
|
||||
qt_standard_project_setup(REQUIRES 6.5)
|
||||
|
||||
qt_add_executable(app6-Repeater
|
||||
main.cpp
|
||||
)
|
||||
|
||||
qt_add_qml_module(app6-Repeater
|
||||
URI 6-Repeater
|
||||
VERSION 1.0
|
||||
QML_FILES Main.qml
|
||||
)
|
||||
|
||||
set_target_properties(app6-Repeater PROPERTIES
|
||||
MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
|
||||
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
|
||||
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
|
||||
MACOSX_BUNDLE TRUE
|
||||
WIN32_EXECUTABLE TRUE
|
||||
)
|
||||
|
||||
target_link_libraries(app6-Repeater
|
||||
PRIVATE Qt6::Quick
|
||||
)
|
||||
|
||||
install(TARGETS app6-Repeater
|
||||
BUNDLE DESTINATION .
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
)
|
||||
@@ -0,0 +1,51 @@
|
||||
// Copyright (c) Daniel Gakwaya.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
import QtQuick
|
||||
import QtQuick.Window
|
||||
|
||||
Window {
|
||||
visible: true
|
||||
width: 640
|
||||
height: 480
|
||||
title: qsTr("Repeater")
|
||||
|
||||
Flickable {
|
||||
contentHeight: columnId.implicitHeight
|
||||
anchors.fill : parent
|
||||
|
||||
|
||||
Column {
|
||||
id: columnId
|
||||
anchors.fill: parent
|
||||
spacing: 2
|
||||
|
||||
Repeater {
|
||||
id: repeaterId
|
||||
|
||||
//model: 15
|
||||
model: ["Jan", "Feb", "March"]
|
||||
delegate: Rectangle {
|
||||
width: parent.width
|
||||
height: 50
|
||||
color: "dodgerblue"
|
||||
|
||||
Text {
|
||||
anchors.centerIn: parent
|
||||
text: modelData
|
||||
font.pointSize: 20
|
||||
}
|
||||
|
||||
MouseArea{
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
console.log("Clicked on: "+modelData)
|
||||
console.log("count: " + repeaterId.count)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
// Copyright (c) Daniel Gakwaya.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include <QGuiApplication>
|
||||
#include <QQmlApplicationEngine>
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
|
||||
QGuiApplication app(argc, argv);
|
||||
|
||||
QQmlApplicationEngine engine;
|
||||
QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed,
|
||||
&app, []() { QCoreApplication::exit(-1); },
|
||||
Qt::QueuedConnection);
|
||||
engine.loadFromModule("6-Repeater", "Main");
|
||||
|
||||
return app.exec();
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
# Copyright (c) Daniel Gakwaya.
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
|
||||
project(7-DynamicModels VERSION 0.1 LANGUAGES CXX)
|
||||
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
find_package(Qt6 6.5 REQUIRED COMPONENTS Quick QuickControls2)
|
||||
|
||||
qt_standard_project_setup(REQUIRES 6.5)
|
||||
|
||||
qt_add_executable(app7-DynamicModels
|
||||
main.cpp
|
||||
)
|
||||
|
||||
qt_add_qml_module(app7-DynamicModels
|
||||
URI 7-DynamicModels
|
||||
VERSION 1.0
|
||||
QML_FILES Main.qml
|
||||
)
|
||||
|
||||
set_target_properties(app7-DynamicModels PROPERTIES
|
||||
MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
|
||||
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
|
||||
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
|
||||
MACOSX_BUNDLE TRUE
|
||||
WIN32_EXECUTABLE TRUE
|
||||
)
|
||||
|
||||
target_link_libraries(app7-DynamicModels
|
||||
PRIVATE Qt6::Quick Qt6::QuickControls2
|
||||
)
|
||||
|
||||
install(TARGETS app7-DynamicModels
|
||||
BUNDLE DESTINATION .
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
)
|
||||
@@ -0,0 +1,116 @@
|
||||
// Copyright (c) Daniel Gakwaya.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
import QtQuick
|
||||
import QtQuick.Window
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
|
||||
Window {
|
||||
visible: true
|
||||
width: 640
|
||||
height: 480
|
||||
title: qsTr("Dynamic Models Demo")
|
||||
|
||||
ListModel {
|
||||
id: mListModel
|
||||
|
||||
ListElement {
|
||||
firstName: "John"; lastName: "Snow"
|
||||
}
|
||||
ListElement {
|
||||
firstName: "Nicholai"; lastName: "Itchenko"
|
||||
}
|
||||
ListElement {
|
||||
firstName: "Mitch"; lastName: "Mathson"
|
||||
}
|
||||
ListElement {
|
||||
firstName: "Ken"; lastName: "Kologorov"
|
||||
}
|
||||
ListElement {
|
||||
firstName: "Vince"; lastName: "Luvkyj"
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
ListView{
|
||||
id: mListViewId
|
||||
model: mListModel
|
||||
delegate: delegateId
|
||||
Layout.fillWidth : true
|
||||
Layout.fillHeight: true
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
Button {
|
||||
text: "Add Item"
|
||||
Layout.fillWidth : true
|
||||
onClicked: {
|
||||
mListModel.append({"firstName": "Daniel", "lastName": "Gakwaya"})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Button {
|
||||
text: "Clear"
|
||||
Layout.fillWidth : true
|
||||
onClicked: {
|
||||
mListModel.clear()
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Button {
|
||||
text: "Delete Item at index 2"
|
||||
Layout.fillWidth: true
|
||||
onClicked: {
|
||||
if ( 2 < mListViewId.model.count){
|
||||
mListModel.remove(2,1)
|
||||
}else{
|
||||
console.log("index is invalid")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Button {
|
||||
text: "Set item at index 1"
|
||||
Layout.fillWidth: true
|
||||
onClicked: {
|
||||
mListModel.set(1,{"firstName": "John", "lastName": "Doe"})
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Component {
|
||||
id: delegateId
|
||||
Rectangle {
|
||||
id: rectangleId
|
||||
width: mListViewId.width
|
||||
height: 50
|
||||
color: "beige"
|
||||
border.color: "yellowgreen"
|
||||
radius: 14
|
||||
|
||||
Text {
|
||||
id: textId
|
||||
anchors.centerIn: parent
|
||||
text : firstName + " " + lastName
|
||||
font.pointSize: 20
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
console.log("Clicked on: " + firstName + " " + lastName)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
// Copyright (c) Daniel Gakwaya.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include <QGuiApplication>
|
||||
#include <QQmlApplicationEngine>
|
||||
#include <QQuickStyle>
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
|
||||
QGuiApplication app(argc, argv);
|
||||
|
||||
QQmlApplicationEngine engine;
|
||||
QQuickStyle::setStyle("Material");
|
||||
QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed,
|
||||
&app, []() { QCoreApplication::exit(-1); },
|
||||
Qt::QueuedConnection);
|
||||
engine.loadFromModule("7-DynamicModels", "Main");
|
||||
|
||||
return app.exec();
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
# Copyright (c) Daniel Gakwaya.
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
|
||||
project(8-GridView VERSION 0.1 LANGUAGES CXX)
|
||||
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
find_package(Qt6 6.5 REQUIRED COMPONENTS Quick)
|
||||
|
||||
qt_standard_project_setup(REQUIRES 6.5)
|
||||
|
||||
qt_add_executable(app8-GridView
|
||||
main.cpp
|
||||
)
|
||||
|
||||
qt_add_qml_module(app8-GridView
|
||||
URI 8-GridView
|
||||
VERSION 1.0
|
||||
QML_FILES Main.qml
|
||||
)
|
||||
|
||||
set_target_properties(app8-GridView PROPERTIES
|
||||
MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
|
||||
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
|
||||
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
|
||||
MACOSX_BUNDLE TRUE
|
||||
WIN32_EXECUTABLE TRUE
|
||||
)
|
||||
|
||||
target_link_libraries(app8-GridView
|
||||
PRIVATE Qt6::Quick
|
||||
)
|
||||
|
||||
install(TARGETS app8-GridView
|
||||
BUNDLE DESTINATION .
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
)
|
||||
@@ -0,0 +1,73 @@
|
||||
// Copyright (c) Daniel Gakwaya.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
import QtQuick
|
||||
import QtQuick.Window
|
||||
|
||||
Window {
|
||||
visible: true
|
||||
width: 640
|
||||
height: 480
|
||||
title: qsTr("GridView")
|
||||
|
||||
|
||||
ListModel {
|
||||
id: modelId
|
||||
|
||||
ListElement {
|
||||
mNumber: 1
|
||||
mColor: "red"
|
||||
}
|
||||
ListElement {
|
||||
mNumber: 2
|
||||
mColor: "green"
|
||||
}
|
||||
ListElement {
|
||||
mNumber: 3
|
||||
mColor: "beige"
|
||||
}
|
||||
ListElement {
|
||||
mNumber: 4
|
||||
mColor: "yellowgreen"
|
||||
}
|
||||
ListElement {
|
||||
mNumber: 5
|
||||
mColor: "dodgerblue"
|
||||
}
|
||||
ListElement {
|
||||
mNumber: 6
|
||||
mColor: "lightyellow"
|
||||
}
|
||||
ListElement {
|
||||
mNumber: 7
|
||||
mColor: "pink"
|
||||
}
|
||||
ListElement {
|
||||
mNumber: 8
|
||||
mColor: "magenta"
|
||||
}
|
||||
ListElement {
|
||||
mNumber: 9
|
||||
mColor: "silver"
|
||||
}
|
||||
}
|
||||
|
||||
GridView{
|
||||
id: mGridViewId
|
||||
anchors.fill: parent
|
||||
flow : GridView.FlowTopToBottom
|
||||
layoutDirection: Qt.RightToLeft
|
||||
model: modelId
|
||||
delegate: Rectangle {
|
||||
width: 100
|
||||
height: width
|
||||
color: mColor
|
||||
Text {
|
||||
text: mNumber
|
||||
anchors.centerIn: parent
|
||||
font.pointSize: 20
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
// Copyright (c) Daniel Gakwaya.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include <QGuiApplication>
|
||||
#include <QQmlApplicationEngine>
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
|
||||
QGuiApplication app(argc, argv);
|
||||
|
||||
QQmlApplicationEngine engine;
|
||||
QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed,
|
||||
&app, []() { QCoreApplication::exit(-1); },
|
||||
Qt::QueuedConnection);
|
||||
engine.loadFromModule("8-GridView", "Main");
|
||||
|
||||
return app.exec();
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
# Copyright (c) Daniel Gakwaya.
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
|
||||
project(9-XmlListModel VERSION 0.1 LANGUAGES CXX)
|
||||
|
||||
set(CMAKE_AUTORCC ON)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
find_package(Qt6 6.5 REQUIRED COMPONENTS Quick)
|
||||
|
||||
qt_standard_project_setup(REQUIRES 6.5)
|
||||
|
||||
qt_add_executable(app9-XmlListModel
|
||||
main.cpp resource.qrc
|
||||
)
|
||||
|
||||
qt_add_qml_module(app9-XmlListModel
|
||||
URI 9-XmlListModel
|
||||
VERSION 1.0
|
||||
QML_FILES Main.qml
|
||||
)
|
||||
|
||||
set_target_properties(app9-XmlListModel PROPERTIES
|
||||
MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
|
||||
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
|
||||
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
|
||||
MACOSX_BUNDLE TRUE
|
||||
WIN32_EXECUTABLE TRUE
|
||||
)
|
||||
|
||||
target_link_libraries(app9-XmlListModel
|
||||
PRIVATE Qt6::Quick
|
||||
)
|
||||
|
||||
install(TARGETS app9-XmlListModel
|
||||
BUNDLE DESTINATION .
|
||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
)
|
||||
@@ -0,0 +1,67 @@
|
||||
// Copyright (c) Daniel Gakwaya.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
import QtQuick
|
||||
import QtQuick.Window
|
||||
import QtQml.XmlListModel
|
||||
|
||||
|
||||
Window {
|
||||
visible: true
|
||||
width: 640
|
||||
height: 480
|
||||
title: qsTr("XmlListModel")
|
||||
|
||||
|
||||
XmlListModel {
|
||||
id: mXmlListModelId
|
||||
source: "qrc:/xml/employees.xml"
|
||||
query: "/courses/course"
|
||||
|
||||
XmlListModelRole {
|
||||
name: "instructor"
|
||||
elementName: "instructor"
|
||||
}
|
||||
XmlListModelRole {
|
||||
name: "year"
|
||||
elementName: "year"
|
||||
}
|
||||
XmlListModelRole {
|
||||
name: "coursename"
|
||||
elementName: "coursename"
|
||||
}
|
||||
XmlListModelRole { name: "hot"
|
||||
elementName: "coursename"
|
||||
attributeName: "hot"
|
||||
}
|
||||
}
|
||||
|
||||
ListView{
|
||||
id: mListViewId
|
||||
anchors.fill: parent
|
||||
model : mXmlListModelId
|
||||
delegate: Rectangle {
|
||||
width : parent.width
|
||||
height: 50
|
||||
color: "beige"
|
||||
Row {
|
||||
spacing: 30
|
||||
Text {
|
||||
text: instructor
|
||||
font.pointSize: 15
|
||||
}
|
||||
Text {
|
||||
text: coursename + " (" + year + ")"
|
||||
font.bold: hot === "true" ? true : false
|
||||
font.pointSize: 15
|
||||
}
|
||||
}
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
onClicked: {
|
||||
console.log("Clicked on: "+ hot)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
// Copyright (c) Daniel Gakwaya.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include <QGuiApplication>
|
||||
#include <QQmlApplicationEngine>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
|
||||
QGuiApplication app(argc, argv);
|
||||
|
||||
QQmlApplicationEngine engine;
|
||||
QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed,
|
||||
&app, []() { QCoreApplication::exit(-1); },
|
||||
Qt::QueuedConnection);
|
||||
engine.loadFromModule("9-XmlListModel", "Main");
|
||||
|
||||
return app.exec();
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<file>xml/employees.xml</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
@@ -0,0 +1,30 @@
|
||||
<!-- Copyright (c) Daniel Gakwaya. -->
|
||||
<!-- SPDX-License-Identifier: MIT -->
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<courses>
|
||||
<course>
|
||||
<instructor>Matt Kabwe</instructor>
|
||||
<year>2002</year>
|
||||
<coursename hot ="true">Operating Systems</coursename >
|
||||
</course>
|
||||
<course>
|
||||
<instructor>Daniel Gwo</instructor>
|
||||
<year>2010</year>
|
||||
<coursename hot = "false">Object Oriented Programming (Java)</coursename >
|
||||
</course>
|
||||
<course>
|
||||
<instructor>Nathan Mepp</instructor>
|
||||
<year>2011</year>
|
||||
<coursename hot = "false">Embedded Systems</coursename >
|
||||
</course>
|
||||
<course >
|
||||
<instructor>Lilian Gwiza</instructor>
|
||||
<year>2015</year>
|
||||
<coursename hot = "false">IT Project Management</coursename >
|
||||
</course>
|
||||
<course>
|
||||
<instructor>John Wiks</instructor>
|
||||
<year>2023</year>
|
||||
<coursename hot = "true">C is Still King</coursename >
|
||||
</course>
|
||||
</courses>
|
||||
Reference in New Issue
Block a user