Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.9.1 - Qt Creator : 4.4.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

Custom QMimeTypes

Salut à tous,

Comment créer des MimeTypes pour des types de document spécifiques à son application ?

Réponses

  • 12 Sep modifié
    Re,
    regarde du côté de QMimeDatabase

    Applications which want to define custom MIME types need to install an XML file into the locations searched for MIME definitions.
    ils mettent un exemple de fichier xml
  • Sur Linux ok, mais pour OSX et Windows ?
  • Dans la doc de QMimeData ils donnent cette technique :

    There are three approaches for storing custom data in a QMimeData object:
    Custom data can be stored directly in a QMimeData object as a QByteArray using setData(). For example:
      QByteArray csvData = ...;

    QMimeData *mimeData = new QMimeData;
    mimeData->setData("text/csv", csvData);
    We can subclass QMimeData and reimplement hasFormat(), formats(), and retrieveData().
    If the drag and drop operation occurs within a single application, we can subclass QMimeData and add extra data in it, and use a qobject_cast() in the receiver's drop event handler. For example:
      void MyWidget::dropEvent(QDropEvent *event)
    {
    const MyMimeData *myData =
    qobject_cast<const MyMimeData *>(event->mimeData());
    if (myData) {
    // access myData's data directly (not through QMimeData's API)
    }
    }

  • Oui, j'ai vu tout ça, ce n'est pas approprié à ce que je veux faire.

    Supposons une classe abstraite avec cette méthode:
    virtual bool canOpenDocumentOfType(const QMimeType &type)=0;
    J'ai eu l'idée d'utiliser un MimeType plutot qu'une extension car plusieurs types d'extension peuvent exister pour un même type de doc (ex: jpg jpeg jpe)

    Donc, le problème est: comment créer des QMimeTypes pour les types de doc perso ?

    Regardant la doc, j'en ai déduit que cela n'était pas possible.
    Mais je pose la question, au cas ou une astuce m'aurait échappée.
  • Alors j'ai fouillé un peu le code de Qt, et ça m'a pas l'air possible comme ça car :
    QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QLatin1String("mime/packages"), QStandardPaths::LocateDirectory);
    ne renvoie rien donc ensuite ils vont lire dans un fichier de ressources
    :/qt-project.org/qmime/freedesktop.org.xml
    mais tout ceci n'est pas modifiable par code car tout est privé.

    QList<QMimeType> QMimeDatabasePrivate::allMimeTypes()
    {
    return provider()->allMimeTypes();
    }
    avec provider() qui retourne un QMimeXMLProvider.

    Donc à moins de modifier le fichier de ressource et lui ajouter un nouveau contenu xml, je ne vois pas comment faire.
  • Donc à moins de modifier le fichier de ressource et lui ajouter un nouveau contenu xml, je ne vois pas comment faire.
    Seul Linux utilise les MimeTypes en fait, donc ce n'est pas une solution multiplateformes.

    Reste l'archaîque extension de fichier, pas d'autre choix.
Connectez-vous ou Inscrivez-vous pour répondre.