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

Qt Discussion :

Bug de QFileDialog via un QStyledItemDelegate. ou bien ?


Sujet :

Qt

  1. #1
    Membre à l'essai
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Novembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 16
    Points : 19
    Points
    19
    Par défaut Bug de QFileDialog via un QStyledItemDelegate. ou bien ?
    Bonjour à tous,

    Je travaille sur un projet ou l'utilisateur doit renseigner des champs de type varié.
    Mes formulaires sont donc affichés dans un QTreeView et un QStyledItemDelegate crée un widget spécifique selon le type du champ à renseigner, un peu comme l'inspecteur d'objet du Designer.
    Lorsque le champs à renseigner est un chemin de fichier ma classe QStyledItemDelegate (IntelligenceParametersItemDelegate) retourne un QWigdet (IntelligenceParametersHelperOneFileWidget) à l'appel de createEditor().
    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
    QWidget* IntelligenceParametersItemDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& /*option*/, const QModelIndex& index) const {
        QVariant dataType = index.data(Qt::EditRole);
    //    QVariant value = index.data();
        QWidgetIntelligenceParametersHelper  *editor = NULL;
        ...
            CohActionAlgoInputValidator validator = dataType.value<CohActionAlgoInputValidator>();
            ...
                }else if(validatorP->instanceOf(CohActionAlgoInputOneFilePathValidator::staticClassName())){
                    editor = new IntelligenceParametersHelperOneFileWidget(parent);
                }else ...
            }
        }
        ...
     
        editor->setDataType(dataType);
     
        return editor;
    }
    IntelligenceParametersHelperOneFileWidget contient un QLineEdit et un QToolButton, et lorsque l'on clique sur le QToolButton je fait appele à QFileDialog::getOpenFileName(this, ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void IntelligenceParametersHelperOneFileWidget::OnBrowse(){
        QString s = m_extensions;
        QString supportedFile = trUtf8("Supported File (%1)").arg(s.replace(';', ' '));
     
        QString filePath = QFileDialog::getOpenFileName(this, trUtf8("Sélectionner un Fichier"), ".", supportedFile);
        if(!filePath.isEmpty()){
            CohPath path(filePath);
            setValueData(qVariantFromValue(path));
        }
    }
    et c'est là que ça bug.
    En débuggant je m'aperçoit que dès que je fait appele à QFileDialog::getOpenFileName(), QStyledItemDelegate::destroyEditor() est appelé.
    J'ai essayé diverse méthode (dlg = new QFileDialog; dlg->open(...) ect...) mais rien à faire soit ça bug soit la valeur n'est pas renseigné soit le QFileDialog ne s'affiche pas...
    A priori l'appel à QFileDialog::getOpenFileName() me fait perdre le focus et patatra!!
    Mais j'ai également essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QFileDialog::getOpenFileName(this, trUtf8("Sélectionner un Fichier"), ".", supportedFile, NULL, QFileDialog::DontUseNativeDialog);
    et là ça marche.

    Donc pour finir, ma question est : Est-ce un bug de QFileDialog en mode natif ou y-a-t'il quelque chose de plus à faire pour que ça fonctionne ?
    Parceque le QFileDialog non natif résout mon problème mais la fenêtre n'est vraiment pas "cute".

    Merci

    PS : je suis sous Windows Seven et je viens de passé à Qt 5.2.1 et quand j'utilisais Qt 5.1 tout marchais très bien.

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    J'ai été confronté à un comportement similaire et pourtant, je suis en Qt 5.1.
    J'avais un comportement étrange quand j'appelais un messagebox dans setModelData(). De la même façon, Qt fermait l'éditeur, avant d'ouvrir la messageBox, ce qui posait des problèmes.

    Pour résoudre le problème, j'ai entouré l'appel à la messageBox par (xxx=true avant et false après) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this->blockSignals(xxx);
    Je te suggère donc d'essayer quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            this->blockSignals(true);
            QString filePath = QFileDialog::getOpenFileName(this, trUtf8("Sélectionner un Fichier"), ".", supportedFile);
            if(!filePath.isEmpty()){
                 CohPath path(filePath);
                 setValueData(qVariantFromValue(path));
            }
            this->blockSignals(false);
    Ca peut peut-être marcher ???

  3. #3
    Membre à l'essai
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Novembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 16
    Points : 19
    Points
    19
    Par défaut
    merci pour ton aide Dr FMeuuh. Ton idée était prometteuse mais sous Qt 5.2.1 ça ne marche pas non-plus.
    Avec ce code :
    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
    IntelligenceParametersHelperOneFileWidget::~IntelligenceParametersHelperOneFileWidget(){
        qDebug() << Q_FUNC_INFO;
    }
    void IntelligenceParametersHelperOneFileWidget::OnBrowse(){
        QString s = m_extensions;
        QString supportedFile = tr("Supported File (%1)").arg(s.replace(';', ' '));
        this->blockSignals(true);
        qDebug() << Q_FUNC_INFO << "avant QFileDialog::getOpenFileName";
        QString filePath = QFileDialog::getOpenFileName(this, "Sélectionner un Fichier", ".", supportedFile/*, NULL, QFileDialog::DontUseNativeDialog*/);
        qDebug() << Q_FUNC_INFO << "apres QFileDialog::getOpenFileName";
        if(!filePath.isEmpty()){
            CohPath path(filePath);
            setValueData(qVariantFromValue(path));
        }
        this->blockSignals(false);
    }
    Le QFileDialog s'ouvre, je selectionne mon fichier, appui sur entrer et ... le programme plante. J'obtiens ceci en console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    virtual void IntelligenceParametersHelperOneFileWidget::OnBrowse() avant QFileDialog::getOpenFileName
    virtual IntelligenceParametersHelperOneFileWidget::~IntelligenceParametersHelperOneFileWidget() 
     
    RUN FAILED (exit value -1*073*741*819, total time: 22s)
    Sous Qt 5.1, effectivement le comportement de se code était un peu erratique mais ne provoquait pas de bug et ça marchais (juste une perte du focus de temps à autre rendant le clique sur le QToolButton difficile). J'imagine que l'usage de this->blockSignals(xxx) le rend + stable mais pour mon malheur j'ai changé de version de Qt et j'ai pas vraiment envie de faire marche arrière étant donné le nombre de librairie annexe que j'ai du recompiler ses dernier jours.

    En faite pour un autre type de donnée (typedef QList<CohPath> CohPathList;) j'utilise un peu près le même composant mais dans ma fonction OnBrowse() j'ouvre une boite de dialogue perso, et celle ci marche toujours très bien, et même mieux qu'avant.
    Le bug semble donc limité à QFileDialog en mode natif.

    Merci quand même pour ton aide

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/10/2010, 14h38
  2. Réponses: 1
    Dernier message: 06/08/2008, 15h44
  3. Bug aléatoire et pas très bien compris (open/close_system)
    Par LordPeterPan2 dans le forum Simulink
    Réponses: 8
    Dernier message: 03/07/2007, 11h08
  4. Réponses: 4
    Dernier message: 30/08/2006, 17h52
  5. [VBA] pointer sur une feuille bien précise via inputbox
    Par beegees dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/01/2006, 19h37

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