Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. French
  4. Base de bonnes mysql et listview qml réactualisés les données

Base de bonnes mysql et listview qml réactualisés les données

Scheduled Pinned Locked Moved Unsolved French
2 Posts 2 Posters 319 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • F Offline
    F Offline
    Fortiga
    wrote on 29 Jun 2024, 00:14 last edited by
    #1

    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

    Juste pour aller de l'avant et apprendre des choses, lorsque vous voulez devenir une légende, cela ne se fait pas du jour au lendemain.

    1 Reply Last reply
    0
    • T Offline
      T Offline
      Txai
      wrote on 12 Jul 2024, 01:30 last edited by
      #2

      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!

      1 Reply Last reply
      0

      • Login

      • Login or register to search.
      • First post
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • Users
      • Groups
      • Search
      • Get Qt Extensions
      • Unsolved