diff --git a/motus/CMakeLists.txt b/motus/CMakeLists.txt
index 47d03d0853a2491d896e63c4dfc0eb27f7dadf88..7a913d9622fde97304528820dfe73bfb4327ed09 100644
--- a/motus/CMakeLists.txt
+++ b/motus/CMakeLists.txt
@@ -38,6 +38,7 @@ qt_add_qml_module(appmotus
         SOURCES grillemanager.h grillemanager.cpp
         QML_FILES Case.qml
         QML_FILES Grille.qml
+        SOURCES lettermodel.h lettermodel.cpp
 )
 
 # Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
diff --git a/motus/GameWindow.qml b/motus/GameWindow.qml
index eb6f17e21ef8289706ad5da835ac64f581f72c7e..79a13687f694a526559a623c1ed3c5aeb092f0a7 100644
--- a/motus/GameWindow.qml
+++ b/motus/GameWindow.qml
@@ -1,10 +1,5 @@
-
-
-
 import QtQuick
-
-
-
+import QtQuick.Controls
 
 Item {
     width: 900
@@ -15,6 +10,33 @@ Item {
         color: "#ffffff"
         anchors.fill: parent
 
+        Grid {
+            id: letterGrid
+            columns: 8
+            rows: 5
+            spacing: 4
+            anchors.centerIn: parent
+            width: 600
+            height: 400
+
+            Repeater {
+                model: letterModel  // <-- C++ ListModel exposé ici
+                delegate: Rectangle {
+                    width: 60
+                    height: 60
+                    color: "#dddddd"
+                    border.color: "#888"
+                    radius: 5
+
+                    Text {
+                        anchors.centerIn: parent
+                        text: model.letter
+                        font.pixelSize: 24
+                    }
+                }
+            }
+        }
+
         Clavier {
             id: clavier
             x: 225
diff --git a/motus/jeu.cpp b/motus/jeu.cpp
index 1aa63c67e569c51440f42496c7a9350662b11506..0ab0812eb166d19c586e71b14cbacd210b450cc8 100644
--- a/motus/jeu.cpp
+++ b/motus/jeu.cpp
@@ -24,6 +24,16 @@ void Jeu::setContext(QQmlComponent *grilleComponent, QQuickItem* parentItem) {
 }
 
 void Jeu::onClavierClick(QString lettre) {
+
+    if (!m_letterModel)
+        return;
+
+    if (currentIndex < 40) {  // on évite de dépasser la grille
+        m_letterModel->setLetter(currentIndex, lettre);
+        currentIndex++;
+    }
+
+
     brain->entreLettre(lettre.toStdString()[0]);
 }
 
@@ -43,3 +53,7 @@ void Jeu::startGame() {
 
     // grilleManager.createGrid(6, 5); // à synchroniser avec les paramètres du brain
 }
+
+void Jeu::setLetterModel(LetterModel* model) {
+    m_letterModel = model;
+}
diff --git a/motus/jeu.h b/motus/jeu.h
index a13350f97e1992d2af04879addb2e7688dfde005..b5fb35780d111bd674e2ab86f62ce464ac8a3990 100644
--- a/motus/jeu.h
+++ b/motus/jeu.h
@@ -6,6 +6,7 @@
 #include <QQmlComponent>
 #include "brain.h"
 #include "grillemanager.h"
+#include "lettermodel.h"
 
 class Jeu : public QObject {
     Q_OBJECT
@@ -22,6 +23,7 @@ public:
     GrilleManager* getGrilleManager() { return &grilleManager; }
     QQuickItem* getGameWindow() const { return gameWindow; } // Getter for gameWindow
     void setContext(QQmlComponent *grilleComponent, QQuickItem* parentItem);
+    void setLetterModel(LetterModel* model); // Setter pour le modèle
 
 
 signals:
@@ -34,6 +36,8 @@ private:
     GrilleManager grilleManager;
     QQmlComponent* grilleComponent;
     QQuickItem* gameWindow; // Pointer to the QQuickItem of the GameWindow
+    LetterModel* m_letterModel = nullptr;  // Modèle QML
+    int currentIndex = 0; // Pour suivre où on écrit
 };
 
 #endif // JEU_H
diff --git a/motus/lettermodel.cpp b/motus/lettermodel.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..bc6337032db52f2d705f7cfc02b4ceaa80adc42b
--- /dev/null
+++ b/motus/lettermodel.cpp
@@ -0,0 +1,36 @@
+#include "lettermodel.h"
+
+LetterModel::LetterModel(QObject *parent)
+    : QAbstractListModel(parent)
+{
+    // Initialiser 40 lettres avec "_"
+    m_letters.fill("_", 40);
+}
+
+int LetterModel::rowCount(const QModelIndex &parent) const {
+    Q_UNUSED(parent);
+    return m_letters.size();
+}
+
+QVariant LetterModel::data(const QModelIndex &index, int role) const {
+    if (!index.isValid() || index.row() < 0 || index.row() >= m_letters.size())
+        return QVariant();
+
+    if (role == LetterRole)
+        return m_letters.at(index.row());
+
+    return QVariant();
+}
+
+QHash<int, QByteArray> LetterModel::roleNames() const {
+    return {
+        { LetterRole, "letter" }
+    };
+}
+
+void LetterModel::setLetter(int index, const QString &value) {
+    if (index >= 0 && index < m_letters.size()) {
+        m_letters[index] = value;
+        emit dataChanged(this->index(index), this->index(index), { LetterRole });
+    }
+}
diff --git a/motus/lettermodel.h b/motus/lettermodel.h
new file mode 100644
index 0000000000000000000000000000000000000000..fe90feb67010be2c1b2918fcd034823e4702b877
--- /dev/null
+++ b/motus/lettermodel.h
@@ -0,0 +1,25 @@
+#pragma once
+
+#include <QAbstractListModel>
+#include <QString>
+#include <QVector>
+
+class LetterModel : public QAbstractListModel {
+    Q_OBJECT
+
+public:
+    enum Roles {
+        LetterRole = Qt::UserRole + 1
+    };
+
+    explicit LetterModel(QObject *parent = nullptr);
+
+    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
+    QVariant data(const QModelIndex &index, int role) const override;
+    QHash<int, QByteArray> roleNames() const override;
+
+    Q_INVOKABLE void setLetter(int index, const QString &value);
+
+private:
+    QVector<QString> m_letters;
+};
diff --git a/motus/main.cpp b/motus/main.cpp
index 7a39861244667f377022e2b8b9edd2f689a84a0e..b8a19260a1316d579d54c657ea33fcb401b31812 100644
--- a/motus/main.cpp
+++ b/motus/main.cpp
@@ -6,6 +6,7 @@
 #include "jeu.h"
 #include "vraiecase.h"
 #include "grillemanager.h"
+#include "lettermodel.h"
 
 int main(int argc, char *argv[]) {
     QGuiApplication app(argc, argv);
@@ -17,6 +18,9 @@ int main(int argc, char *argv[]) {
 
 
     // Charger l'interface utilisateur (QML)
+    LetterModel letterModel;
+    engine.rootContext()->setContextProperty("letterModel", &letterModel);
+
     engine.loadFromModule("motus", "Main");
     QObject *rootObject = engine.rootObjects().first(); // Gets the first root object
     QQuickItem *rootItem = qobject_cast<QQuickItem *>(rootObject);
@@ -26,6 +30,7 @@ int main(int argc, char *argv[]) {
     QQuickItem *parentItem = rootItem;
     // Créer l'objet Jeu sans mot
     Jeu jeu;
+    jeu.setLetterModel(&letterModel);
     engine.rootContext()->setContextProperty("jeu", &jeu);
 
     jeu.setContext(&grilleComponent,parentItem);
@@ -33,3 +38,5 @@ int main(int argc, char *argv[]) {
 
     return app.exec();
 }
+
+