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().
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, ...
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
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.
Partager