IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Sauvegarde sur perte du focus pour un QComboBox

  1. #1
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2011
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 316
    Points : 126
    Points
    126
    Par défaut Sauvegarde sur perte du focus pour un QComboBox
    Bonjour,

    je voudrais sauvegarder ma stringlist avec le nouveau texte entré dans le combobox quand je clique a un autre endroit. et je voudrais que cette valeur reste afficher sur ce combo et enlever les blancs eventuels:

    voici ou j'en suis;

    (je ne voit pas quoi mettre a la place des ??????, je ne voit pas comment virer les blancs et reafficher la valeur sauvegarder malgré le trie alphabetique.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    ....
    connect(text2ComboBox, SIGNAL(????????), this, SLOT(comboSave()));
    ....
    void Filtrer::comboSave()
    {
        combofiltreslistchoix << text2ComboBox->currentText();
        combofiltreslistchoix.removeDuplicates();
        combofiltreslistchoix.sort();
        text2ComboBox->clear();
        text2ComboBox->addItems(combofiltreslistchoix);
        QFile ComboFiltresChoix(QCoreApplication::applicationDirPath()+ "/ComboFiltresChoix.xav");
        if (ComboFiltresChoix.open(QFile::WriteOnly | QFile::Text)) {
            QTextStream s(&ComboFiltresChoix);
            for (int i = 0; i < combofiltreslistchoix.size(); ++i)
                s << combofiltreslistchoix.at(i) << '\n';
        }
    }
    pourriez vous m'aiguiller svp?

    Cordialement

  2. #2
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Bonjour,

    quand je clique a un autre endroit
    => focusOutEvent() (événement de perte du focus)

    En fait tu n'as pas de signal pour ça. Il faut redéfinir void focusOutEvent(QFocusEvent* e) dans la classe ComboBox. Donc il te faut également faire ta propre classe héritant de QComboBox (si ce n'est pas fait) pour redéfinir cet événement. Ça a l'air complexe mais c'est naturel en fait, en objet on fait ça tout le temps

    Autre solution, tu changes ta condition (par exemple, "quand la sélection change" = signal void currentIndexChanged ( const QString & text ) ).

  3. #3
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2011
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 316
    Points : 126
    Points
    126
    Par défaut
    Bonjour,

    si Troudhyl n'existait pas .....il faudrait l'inventer !!!!

    merci beaucoup...

    pour la theorie, j'ai tout compris (je m'ameliore (si si !!!!)) et comme tu le dit si bien c'est le coté naturel de la chose que je vais digéré un peu plus longtemps !!!!

    je me mets au boulot, pour essayer d'avancer et comme dab, je vous tients au courants.

    Cordialement

  4. #4
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2011
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 316
    Points : 126
    Points
    126
    Par défaut
    Bonjour,

    je ne peux pas utiliser la 2eme solution car quand je rentre une donnée dans le combobox, je ne change pas d'index; (Je choisi ce que je desire sur un combobox vide au depart, je prend dans la liste si mon choix existe, sinon je le rentre et l'idee et de le sauvegarder aussi pour la foi d'après.

    pour la premiere solution, je dois incorporer;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    connect(text2ComboBox, SIGNAL(focusOutEvent()), this, SLOT(comboSave()));
    void Filtrer::focusOutEvent()
    {
    instructions...
    }
    mais comment
    redéfinir void focusOutEvent(QFocusEvent* e) dans la classe ComboBox
    je sais, j'suis mauvais, mais justement j'essaye de me soigner et surtout je persevere.

    Cordialement

  5. #5
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Être débutant ce n'est pas être mauvais J'ai pas trop le temps de développer (je n'avais pas le temps hier non plus sinon je l'aurais fait un peu).

    Il me semble avoir clairement dit qu'il n'y a pas de signal, donc tu peux effacer tout "connect" en rapport avec ta question, focusOutEvent n'est pas un signal mais une fonction classique, qui se déclenche immédiatement lors de la perte du focus.

    Si tu la redéfinis dans Filtrer, tu traites la perte de focus de Filtrer (je ne sais pas ce que c'est, mais à mon avis ce n'est pas ta combobox).

    text2ComboBox, c'est quoi ? C'est lui qui doit avoir son focusOutEvent redéfini.

    Pas le temps de développer plus là, je repasserai peut-être dans la journée

  6. #6
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2011
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 316
    Points : 126
    Points
    126
    Par défaut
    Merci,

    ok, je n'avais donc riens compris contrairement a ce que je disais dans ma 1ere reponse.

    Filtrer est une fenetre qui me permet de trier une liste de fichiers selon:

    mon 1er critere dans une QComboBox (text2ComboBox) (genre, annee...)
    l'utilisateur peut donc ajouter des criteres non creés par defautsauvegardés ou supprimer par la suite.

    mon 2eme critere qui depend du premier dans une QComboBox (textComboBox) par exemple pour annee selectionner 2000, 2001...2011
    l'utilisateur peut donc ajouter des criteres non creés par defaut sauvegardés ou supprimer par la suite.

    voici mon code:

    filtrer.h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    #ifndef FILTRER_H
    #define FILTRER_H
     
    #include <QDialog>
    #include <QDir>
     
    QT_BEGIN_NAMESPACE
    class QComboBox;
    class QLabel;
    class QPushButton;
    class QTableWidget;
    class QTableWidgetItem;
    class QStringList;
    QT_END_NAMESPACE
     
    class Filtrer : public QDialog
    {
        Q_OBJECT
     
    public:
        Filtrer(QWidget *parent = 0);
        QString getfindFilm();
     
    private slots:
        void find();
     
    public slots:
        void openFileOfItem(int row, int column);
        void comboChanged(int);
     
    private:
        QStringList findFiles(const QStringList &files, const QString &text);
        void showFiles(const QStringList &files);
        QPushButton *createButton(const QString &text, const char *member);
        QComboBox *createComboBox(const QString &text = QString());
        void createFilesTable();
     
        QComboBox *fileComboBox, *textComboBox, *text2ComboBox;
        QLabel *fileLabel, *textLabel, *text2Label, *filesFoundLabel;
        QPushButton *testsButton, *findButton;
        QTableWidget *filesTable;
        QDir currentDir;
        QString MyAppDirPath, findText, Xavqfile;
        QStringList combofiltreslistchoix, combofiltreslistAnnee, combofiltreslistActeurs, Xavstringlist;
        int choix;
    };
    #endif
    filtrer.cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
     
    #include <QtGui>
     
    #include "filtrer.h"
    #include "QtGestXavMedias.h"
     
    Filtrer::Filtrer(QWidget *parent)
        : QDialog(parent)
    {
        MyAppDirPath =  QCoreApplication::applicationDirPath();
        findButton = createButton(tr("&Chercher"), SLOT(find()));
        textComboBox = createComboBox();
        text2ComboBox = createComboBox();
        textLabel = new QLabel(tr("Rechercher par:"));
        text2Label = new QLabel(tr("Critere de recherche:"));
        filesFoundLabel = new QLabel;
     
        createFilesTable();
     
        QGridLayout *mainLayout = new QGridLayout;
        mainLayout->setSizeConstraint(QLayout::SetNoConstraint);
        mainLayout->addWidget(textLabel, 1, 0, 1, 3);
        mainLayout->addWidget(text2ComboBox, 2, 0, 1, 3);
        mainLayout->addWidget(text2Label, 3, 0, 1, 3);
        mainLayout->addWidget(textComboBox, 4, 0, 1, 3);
        mainLayout->addWidget(filesTable, 5, 0, 1, 3);
        mainLayout->addWidget(filesFoundLabel, 6, 0, 1, 2);
        mainLayout->addWidget(testsButton, 7,1);
        mainLayout->addWidget(findButton, 6, 2, 1, 1);
        setLayout(mainLayout);
     
        setWindowTitle(tr("Filtrer selon Critere :"));
     
        QFile ComboFiltresChoix(QCoreApplication::applicationDirPath()+ "/ComboFiltresChoix.xav");
        if (ComboFiltresChoix.open(QFile::ReadOnly | QFile::Text))
        {
            QTextStream sIn(&ComboFiltresChoix);
            while (!sIn.atEnd())
            combofiltreslistchoix += sIn.readLine();
            text2ComboBox->addItems(combofiltreslistchoix);
        }
        choix = 0;
        connect(text2ComboBox, SIGNAL(activated (int)), this, SLOT(comboChanged(int)));
        }
     
    void Filtrer::comboChanged(int index)
    {
        switch (index){
        case 2:
            Xavqfile = QCoreApplication::applicationDirPath()+ "/ComboFiltresAnnee.xav";
            Xavstringlist = combofiltreslistAnnee;
            choix = 2;
            break;
        case 1:
            Xavqfile = QCoreApplication::applicationDirPath()+ "/ComboFiltresActeurs.xav";
            Xavstringlist = combofiltreslistActeurs;
            choix = 1;
            break;
        }
        QFile ComboFiltres(Xavqfile);
        textComboBox->clear();
        if (ComboFiltres.open(QFile::ReadOnly | QFile::Text))
        {
            QTextStream sIn(&ComboFiltres);
            while (!sIn.atEnd())
            Xavstringlist += sIn.readLine();
            textComboBox->addItems(Xavstringlist);
        }
     
    }
     
    static void updateComboBox(QComboBox *comboBox)
    {
        if (comboBox->findText(comboBox->currentText()) == -1)
            comboBox->addItem(comboBox->currentText());
    }
     
    void Filtrer::find()
    {
        filesTable->setRowCount(0);
     
        QString fileName = ("*.film");
        QString text = textComboBox->currentText();
        QSettings settings("GestXavMedias", "GestXavMedias.ini");
        QString path = (MyAppDirPath + "/" + settings.value("NomUtilisateurDef").toString());
     
        updateComboBox(textComboBox);
     
        currentDir = QDir(path);
        QStringList files;
        if (fileName.isEmpty())
            fileName = "*.film";
        files = currentDir.entryList(QStringList(fileName),
                                     QDir::Files | QDir::NoSymLinks);
     
        if (!text.isEmpty())
            files = findFiles(files, text);
        showFiles(files);
    }
     
    QStringList Filtrer::findFiles(const QStringList &files, const QString &text)
    {
        QProgressDialog progressDialog(this);
        progressDialog.setCancelButtonText(tr("&Abandonner"));
        progressDialog.setRange(0, files.size());
        progressDialog.setWindowTitle(tr("Trouver Film(s)"));
     
        QStringList foundFiles;
     
        for (int i = 0; i < files.size(); ++i) {
            progressDialog.setValue(i);
            progressDialog.setLabelText(tr("recherche du fichier N° %1 of %2...")
                                        .arg(i).arg(files.size()));
            qApp->processEvents();
     
            if (progressDialog.wasCanceled())
                break;
     
            QFile file(currentDir.absoluteFilePath(files[i]));
     
            if (file.open(QIODevice::ReadOnly)) {
                QString line;
                QTextStream in(&file);
                while (!in.atEnd()) {
                    if (progressDialog.wasCanceled())
                        break;
                    line = in.readLine();
                    if (line.contains(text)) {
                        foundFiles << files[i];
                        break;
                    }
                }
            }
        }
        return foundFiles;
    }
     
    void Filtrer::showFiles(const QStringList &files)
    {
        for (int i = 0; i < files.size(); ++i) {
            QTableWidgetItem *fileNameItem = new QTableWidgetItem(files[i]);
            fileNameItem->setFlags(fileNameItem->flags() ^ Qt::ItemIsEditable);
            int row = filesTable->rowCount();
            filesTable->insertRow(row);
            filesTable->setItem(row, 0, fileNameItem);
        }
        filesFoundLabel->setText(tr("%1 fichier(s) trouvé (s)").arg(files.size()) + (" (Double click pour l'ouvrir)"));
        filesFoundLabel->setWordWrap(true);
    }
     
    QPushButton *Filtrer::createButton(const QString &text, const char *member)
    {
        QPushButton *button = new QPushButton(text);
        connect(button, SIGNAL(clicked()), this, member);
        return button;
    }
     
    QComboBox *Filtrer::createComboBox(const QString &text)
    {
        QComboBox *comboBox = new QComboBox;
        comboBox->setEditable(true);
        comboBox->addItem(text);
        comboBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
        return comboBox;
    }
     
    void Filtrer::createFilesTable()
    {
        filesTable = new QTableWidget(0, 1);
        filesTable->setSelectionBehavior(QAbstractItemView::SelectRows);
     
        QStringList labels;
        labels << tr("Nom du film");
        filesTable->setHorizontalHeaderLabels(labels);
        filesTable->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch);
        filesTable->verticalHeader()->hide();
        filesTable->setShowGrid(false);
     
        connect(filesTable, SIGNAL(cellActivated(int,int)),
                this, SLOT(openFileOfItem(int,int)));
        connect(filesTable, SIGNAL(cellActivated(int,int)),
                this, SLOT(accept()));
    }
     
    void Filtrer::openFileOfItem(int row, int /* column */)
    {
        QTableWidgetItem *item = filesTable->item(row, 0);
        QString text = currentDir.absoluteFilePath(item->text());
        findText = text;
        filesFoundLabel->clear();
        hide();
    }
     
    QString Filtrer::getfindFilm()
    {
        return findText;
    }
    cordialement

  7. #7
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Alors, pour tout te dire, ce que tu veux faire avec les combobox et le programme lui-même ne nous intéresse pas pour répondre à ta question. C'est juste que dans le bout de code que t'as donné, on ne connaissait pas les types des objets (déclarations).

    Donc comme je t'ai dit, il te faut redéfinir la classe QComboBox pour écrire ta propre fonction focusOutEvent() (et toutes celles que tu veux). Donc tu n'auras plus QComboBox mais des XavComboBox par exemple

  8. #8
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2011
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 316
    Points : 126
    Points
    126
    Par défaut
    bonjour,

    Je pense avoir compris et avec un autre exemple je vais voir cela.

    Dès que j'ai quelque chose qui marche je le reposte ici.

    par contre cela ne vas pas etre tout de suite, car j'ai gerer mon probleme autrement. Mais je reste très interressé par le sujet.

    j'avais poster le message au mauvais endroit

    Cordialement

Discussions similaires

  1. Evénement pour empêcher la perte de focus sur TEdit
    Par Greldinard dans le forum Composants VCL
    Réponses: 7
    Dernier message: 17/10/2013, 08h56
  2. sauvegarde sur serveur distant (aide pour un projet)
    Par teddy97234 dans le forum Développement
    Réponses: 1
    Dernier message: 17/01/2012, 17h31
  3. [Swing]Perte de focus pour keyboardListener
    Par forumde dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 08/05/2009, 15h19
  4. Maintien scroll sur perte focus
    Par jharscoet dans le forum IHM
    Réponses: 8
    Dernier message: 17/06/2007, 23h43
  5. Contrôle de saisie sur une perte de focus d'une JTextfield
    Par comeochris dans le forum Composants
    Réponses: 3
    Dernier message: 03/04/2006, 15h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo