From 8483a9f7abe52650ae4fdad948b8940ea57c4e1d Mon Sep 17 00:00:00 2001 From: talksik Date: Thu, 8 Feb 2024 10:49:05 -0800 Subject: [PATCH] implementations for abstract list model and trying to get signals and slots updating list data --- CMakeLists.txt.user | 2 +- Main.qml | 20 ++++++++++++--- NetworkScanner.cpp | 59 ++++++++++++++++++++++++++++++++++++++++++++- NetworkScanner.h | 42 +++++++++++++++++++++++--------- main.cpp | 19 ++++++++++----- 5 files changed, 119 insertions(+), 23 deletions(-) diff --git a/CMakeLists.txt.user b/CMakeLists.txt.user index 21fb62e..36af336 100644 --- a/CMakeLists.txt.user +++ b/CMakeLists.txt.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/Main.qml b/Main.qml index ecc6de5..e2e1cbc 100644 --- a/Main.qml +++ b/Main.qml @@ -1,18 +1,32 @@ import QtQuick import QtQuick.Controls -Window { +Rectangle { id: window width: 640 height: 480 visible: true - title: qsTr("WIFI picker") + + required property var networksModel signal scanNetworks() Button { - id: scanButton + id: scanbutton text: "Scan for networks" onClicked: window.scanNetworks() } + + ListView { + id: listview + objectName: "listview" + model: parent.networksModel + delegate: Rectangle { + required property string name + + Text { + text: parent.name + } + } + } } diff --git a/NetworkScanner.cpp b/NetworkScanner.cpp index 793fdf3..340c553 100644 --- a/NetworkScanner.cpp +++ b/NetworkScanner.cpp @@ -1,7 +1,64 @@ #include "NetworkScanner.h" #include +#include -void NetworkScanner::scan() +QList NetworkScanner::scanForNetworks() { std::cout << "Called the C++ Network scanner class" << std::endl; + + QList networks; + + Network example1 = Network("Gita 2.4Ghz"); + networks.append(example1); + + return networks; +} + +NetworksModel::NetworksModel(QObject *parent) +: + QAbstractListModel(parent) +{ + +} + +int NetworksModel::rowCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent); + return this->m_networks.count(); +} + +QVariant NetworksModel::data(const QModelIndex &index, int role) const +{ + if (index.row() < 9 || index.row() >= this->m_networks.count()) + { + return QVariant(); + } + + const Network& network = this->m_networks.at(index.row()); + if (role == NameRole) + { + return network.name(); + } + + return QVariant(); +} + +void NetworksModel::scan() +{ + QList networks = this->m_networkScanner.scanForNetworks(); + for (const Network& network: networks) + { + qDebug() << "Got network: " << network.name() << Qt::endl; + } + this->m_networks = networks; +} + +Network::Network(const QString &name) + : m_name(name) +{ +} + +QString Network::name() const +{ + return this->m_name; } diff --git a/NetworkScanner.h b/NetworkScanner.h index 3ff7ed7..9d97ab5 100644 --- a/NetworkScanner.h +++ b/NetworkScanner.h @@ -4,24 +4,42 @@ #endif // NETWORKSCANNER_H #include +#include -// class Network -// { -// public: -// enum NetworkStatus { -// Connected = 0, -// Available -// }; +class Network +{ +public: + Network(const QString &name); -// Network(const QString &name, const NetworkStatus &status); - -// QString name; -// NetworkStatus status; -// }; + QString name() const; +private: + QString m_name; +}; class NetworkScanner : public QObject { Q_OBJECT +public: + QList scanForNetworks(); +}; + +class NetworksModel : public QAbstractListModel +{ + Q_OBJECT +public: + enum NetworkRoles + { + NameRole = Qt::UserRole + 1 + }; + + NetworksModel(QObject *parent = nullptr); + int rowCount(const QModelIndex &parent = QModelIndex()) const; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; + public slots: void scan(); + +private: + QList m_networks; + NetworkScanner m_networkScanner; }; diff --git a/main.cpp b/main.cpp index 5148c07..890a81b 100644 --- a/main.cpp +++ b/main.cpp @@ -9,16 +9,23 @@ int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); + NetworksModel model; + QQuickView view; view.setResizeMode(QQuickView::SizeRootObjectToView); - //view.setInitialProperties({{"model", QVariant::fromValue(&model)}}); - view.setSource(QUrl("qrc:/qt/qml/abstractitemmodel/view.qml")); + view.setInitialProperties({{"networksModel", QVariant::fromValue(&model)}}); + view.setSource(QUrl("qrc:/wifipicker/Main.qml")); view.show(); - QQuickItem *rootObject = view.rootObject(); - // QQuickWindow *window = qobject_cast(rootObject); - NetworkScanner networkScanner; - QObject::connect(rootObject, SIGNAL(scanNetworks()), &networkScanner, SLOT(scan())); + if (!view.rootObject()) + { + qDebug() << "No root object found" << Qt::endl; + return -1; + } + + QObject *rootObject = view.rootObject(); + QObject::connect(rootObject, SIGNAL(scanNetworks()), &model, SLOT(scan())); + return app.exec(); }