Base de bonnes mysql et listview qml réactualisés les données
-
j'ai un programme qui fonctionne avec la base de données MySQL (c++) et qui l'affiche sur ListView (qml) jusqu'à la pas de problème.
j'arrive sans problème à ajouter des données mais quand j'ai ajouté les données ils ne s'affichant pas sur l'interface mais pour la base de données oui ça s'ajoute directement pour voir les données qui sont ajoutées sur l'interface il faut fermer le programme et le relancé
je vous mets les fichiers sources
enquete.cpp
#include "enquete.h" Enquete::Enquete(QObject *parent) : QSqlQueryModel{parent} { onConnexion(); refresh(); } bool Enquete::onConnexion() { if(!base.onConnexion()) // class externe pour créer la base de données et les tableaux { qDebug() << ("Impossible de se connect au base de données"); } else { QSqlQuery query; query.prepare("CREATE TABLE IF NOT EXISTS `data-enquete`(nom varchar(20), prenom varchar(25), age varchar(25), sexe varchar(25),service varchar(25), numero varchar(25), date varchar(25), enqueteur varchar(25))"); if(query.exec()) { qDebug() << ("Connexion au base de données"); } else { qDebug() << ("Connexion au base de données"); } } return true; } QVariant Enquete::data(const QModelIndex &index, int role) const { QVariant value; if (index.isValid()) { if (role < Qt::UserRole) { value = QSqlQueryModel::data(index, role); } else { int columnIdx = role - Qt::UserRole - 1; QModelIndex modelIndex = this->index(index.row(), columnIdx); value = QSqlQueryModel::data(modelIndex, Qt::DisplayRole); } } return value; } QHash<int, QByteArray> Enquete::roleNames() const { QHash<int, QByteArray> roles; for (int i = 0; i < this->record().count(); i++) { roles.insert(Qt::UserRole + i + 1, record().fieldName(i).toUtf8()); } return roles; } void Enquete::refresh() { this->setQuery(SQL_SELECT); } const char* Enquete::COLUMN_NAME[] { "nom", "prenom", "age", "sexe", "service", "numero", "date", "enqueteur", NULL }; const char* Enquete::SQL_SELECT={ "SELECT * FROM `data-enquete` WHERE 1" }; bool Enquete::onAddEnquete(QString nom, QString prenom, QString age, QString sexe, QString service, QString numero, QString date, QString enqueteur) { if(!this->base.sql.open()){ if(!onConnexion()) return false; } QSqlQuery query; query.prepare("INSERT INTO `data-enquete`(nom, prenom, age, sexe, service, numero, date, enqueteur)" "VALUES (:nom, :prenom, :age, :sexe, :service, :numero, :date, :enqueteur)"); query.bindValue(":nom", nom); query.bindValue(":prenom", prenom); query.bindValue(":age", age); query.bindValue(":sexe", sexe); query.bindValue(":service", service); query.bindValue(":numero", numero); query.bindValue(":date", date); query.bindValue(":enqueteur", enqueteur); if(query.exec()) { qDebug() << "donnees enregistre"; return true; } else{ qDebug() << "Échec de la préparation de la requête : " << query.lastError().text(); return false; } return false; } bool Enquete::onSaveDetail() { }
fichier listview.cpp
import QtQuick import QtQuick.Controls import QtQuick.Layouts Page { id: root property int iconWidth: 24 property int iconHeight: 24 palette.window: "grey" clip: true Action{ id: onBackAction onTriggered: loginInfo.open() } Action{ id: onMenuOpenAction onTriggered: menu.open() } header: ToolBar{ id: headerTool anchors.top: parent.top RowLayout{ anchors.fill: parent ToolButton{ id: toolBtnUserImage icon.source: "qrc:/image/logoPm.png" icon.width: 48 icon.height: 48 action: onBackAction Layout.alignment: Qt.AlignLeft } ToolButton{ icon.source: "qrc:/image/Menu.svg" icon.width: 24 icon.height: 24 action: onMenuOpenAction Layout.alignment: Qt.AlignRight } } } Popup{ id: loginInfo ColumnLayout{ anchors.fill: parent Pane{ Layout.fillWidth: true Layout.fillHeight: true Column{ Layout.margins: 20 Label{ text: qsTr("Lv :1") } Button{ text: qsTr("Se deconnect") onClicked: stack.pop() } } } } } Menus{ id:menu } Item { height: 20 } Component.onCompleted: { if(enquete.rowCount()) { dataEmpty.visible = false listview.visible = true } else { listview.visible = false dataEmpty.visible = true } } Item{ id: dataEmpty anchors.fill: parent visible: false ColumnLayout { id: column anchors.centerIn: parent Image{ width: 96 height: 96 Layout.alignment: Qt.AlignHCenter //fillMode: Image.PreserveAspectFit source: ("qrc:/image/search_book.png") } Label{ text: qsTr("Ouch") Layout.alignment: Qt.AlignCenter font{ bold: true pointSize: 16 } color: "red" } Label{ text: qsTr("Il a pas encore des enquetes") Layout.alignment: Qt.AlignCenter font{ bold: true pointSize: 16 } color: "black" //anchors.centerIn: parent } } } ListView{ id: listview //visible: false anchors.fill: parent clip: true model: enquete spacing: 25 header: Column { width: parent.width height: 50 // spacing: 20 Label { font.pixelSize: 20 font.bold: true color: "white" anchors.horizontalCenter: parent.horizontalCenter } } delegate:Component { Item { id: pet width: listview.width height: rect.height + listview.spacing required property int index required property string nom required property string prenom required property string age required property string sexe required property string service required property string numero required property string date required property string enqueteur Rectangle {id: rect width: 350; height: 170 anchors.horizontalCenter: parent.horizontalCenter color: "white" gradient: Gradient { GradientStop { position: 0.11; color: "#fff"; } GradientStop { position: 0.27; color: "#FFD8D8"; } GradientStop { position: 0.37; color: "#FFBABA"; } GradientStop { position: 0.59; color: "#FF7878"; } GradientStop { position: 0.80; color: "#FF3A3A"; } GradientStop { position: 1; color: "#FF0000"; } } GridLayout{ columns: 2 anchors.fill: parent Label{ text: qsTr("Nom :") font.bold: true } Text { text: nom font.bold: true } Label{ text: qsTr("Penom :") font.bold: true } Text{ text: prenom font.bold: true } Label{ text: qsTr("Numero telephone :") font.bold: true } Text{ text: numero font.bold: true } Label{ text: qsTr("Service :") font.bold: true } Text{ text: service font.bold: true } Label{ text: qsTr("Enqueteur :") font.bold: true } Text{ text: enqueteur font.bold: true } Label{ text: qsTr("Date :") font.bold: true } Text{ text: date font.bold: true } } MouseArea { anchors.fill: parent onClicked: { console.log(pet.ListView.view.currentIndex = pet.index) stack.push("qrc:/PersoDetail.qml", {nom: pet.nom, prenom: pet.prenom, age: pet.age, sexe: pet.sexe,:service: pet.service,numero: pet.numero, date: pet.date, enqueteur: pet.enqueteur}) } } } } } ScrollBar.vertical: ScrollBar{} } }
si vous aviez comme règles ces problèmes aidez-moi s'il vous plaît ça fait plusieurs mois que je cherchais une solution je suis carrément désespérée
merci d'avance
-
QSqlQueryModel offre un modèle de données en mode lecture seulement.
Quand vous ajoutez des données, vous les ajoutez dans la base de données (.cpp) mais vous ne mettez pas à jour le model QML enquete.
En fait, quand vous ajoutez de nouvelles données, il faudrait informer l'interface que le modèle de données a changé avec "emit dataChanged()"
Je vous cite le paragraphe suivant:
"The model is read-only by default. To make it read-write, you must subclass it and reimplement setData() and flags(). Another option is to use QSqlTableModel, which provides a read-write model based on a single database table."Il faudrait soit reécrire les functions setData() et flags() soit remplacer QSqlQueryModel par QSqlTableModel.
Bonne chance!