Bonjour,
J'aimerais transférer tout le contenu (blocs et ressources) d'un QTextDocument vers un autre. Quelqu'un a-t-il une idée ?
Merci d'avance.
Bonjour,
J'aimerais transférer tout le contenu (blocs et ressources) d'un QTextDocument vers un autre. Quelqu'un a-t-il une idée ?
Merci d'avance.
Qu'entend tu par ressources ? des images ? des objets ( ex: qlabel ) ?
Pour des images, à mon avis ça ne pose pas de probs, vu que qTextEdit,après pour la manip d'objets, quel est le but ?
Pour un QTextDocument, les ressources peuvent être de type image, feuille css, html ou autre (voir QTextDocument::ResourceType).
Mais là, il n'y a pas trop de soucis car j'arrive quand même à récupérer puis insérer les images dans le second document.
Le principale problème c'est la structure elle même qu'il faut reproduire ...
Pas trop saisi la phrase/question !
Je ne sais pas ce que tu entends par ressource
voici un petit bout de code qui fonctionne :
j'ai l'impression que tu ne peux pas cloner un objet tel quel ( j'entend par là duplication de l'objet avec duplication des objets enfants comme un fork )
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Qtextedit* texte=new QTextEdit; hboxlayout->addWidget(texte); texte->setHtml("<br><font color=blue>test<br><img src=:/image1.png>"); QLabel* label=new QLabel("label 1",texte); QTextDocument* document=texte->document(); QTextDocument* document2=texte->clone(); QTextEdit* texte2=new QTextEdit(); texte2->setDocument(document2); hboxlayout(addWidget(texte2));
regardes ça :
http://qt-project.org/faq/answer/how...clone_a_widget
Dans le code ci-dessus, mes 2 QTextEdit s'affichent bien à l'écran, il n'y a pas label 1 dans le second. Mon QLabel fait partie du du QTextEdit et pas du QTextdocument je pense. Je ne sais pas si je peux mettre le QLabel dans le QTextDocument ( je présumes que ça doit être possible mais n'en suis pas sûr je vais essayer). Dans le QTextEdit, j'ai mis une image présente dans mes ressources, celle-ci s'affiche bien dans le second QTextEdit. Si c'est ça ton besoin ...
Bonjour,
Désolé de ne pas avoir eu à réagir plutôt mais j'étais trop penché sur la résolution du problème (un peu urgent).
Ce que tu proposes est bien un "clonage" du document lequel tu l'utilise ailleurs. Mais ce que je veux c'est reproduire la même structure d'un noeud d'un document A dans un noeud dans un document B.
J'ai toutefois avancé sur mes recherches et je suis parvenu à un résultat acceptable (mais ... voir plus bas) et voici le code :
Le "mais ..." au dessus fait allusion à un soucis rencontré avec cette façon de faire :
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 // QTextDocument ao_doc => document vers le quel le contenu sera copié QTextDocument richTextDocument; // Document dont le contenu sera recopié // richTextDocument est supposé être rempli ici ... // Dans cette partie, je récupère toutes les images du document à copier // et je les place dans celui de destination // Pour chaque bloc du document for (QTextBlock bl = richTextDocument.begin(); bl.isValid(); bl = bl.next()) { for (QTextBlock::iterator it = bl.begin(); !it.atEnd(); ++it) { QTextFragment currentFragment = it.fragment(); if (currentFragment.isValid() && currentFragment.charFormat().isImageFormat()) { // Ressource image QString image_name = currentFragment.charFormat().toImageFormat().name(); QVariant image_data=richTextDocument.resource(QTextDocument::ImageResource, image_name); // Ajout de la ressource au document de destination addImageResource(image_data.value<QImage>(), image_name, ao_doc); } } } // Ces deux lignes règlent pour le moment mon soucis ... QTextDocumentFragment docFrag(&richTextDocument); ai_cursor.insertFragment(docFrag);
En approfondissant les tests, il y a un cas qui ne fonctionne pas correctement : si j'insère le bout de document extrait dans un bloc de mon document principal, le style du bloc est pris en compte mais pas le style de caractère.
Le bout de code rajouté par rapport au précédent est placé entre (// ******) :
Le résultat que j'obtiens avec le code ci-dessus est que le texte est bien aligné à droite (Qt::AlignRight) mais le font n'est pas celui fourni (pas de soulignement, texte non italique, etc ...).
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 // QTextDocument ao_doc => document vers le quel le contenu sera copié QTextDocument richTextDocument; // Document dont le contenu sera recopié // richTextDocument est supposé être rempli ici ... // Dans cette partie, je récupère toutes les images du document à copier // et je les place dans celui de destination // Pour chaque bloc du document for (QTextBlock bl = richTextDocument.begin(); bl.isValid(); bl = bl.next()) { for (QTextBlock::iterator it = bl.begin(); !it.atEnd(); ++it) { QTextFragment currentFragment = it.fragment(); if (currentFragment.isValid() && currentFragment.charFormat().isImageFormat()) { // Ressource image QString image_name = currentFragment.charFormat().toImageFormat().name(); QVariant image_data=richTextDocument.resource(QTextDocument::ImageResource, image_name); // Ajout de la ressource au document de destination addImageResource(image_data.value<QImage>(), image_name, ao_doc); } } } // ****** CODE RAJOUTE POUR DEFINIR LE FORMATAGE DE PARAGRAPHE & POLICE ******* ai_cursor.insertBlock(); // QTextCharFormat QTextCharFormat textCharFormat; QFont font; font.setFamily("Arial"); font.setItalic(true); font.setBold(false); font.setUnderline(true); textCharFormat.setFont(font); ai_cursor.setCharFormat(textCharFormat); // QTextBlockFormat QTextBlockFormat textBlockFormat; textBlockFormat.setAlignment(Qt::AlignRight); ai_cursor.setBlockFormat(textBlockFormat); // ****** FIN CODE RAJOUTE ******** // Ces deux lignes règlent pour le moment mon soucis ... QTextDocumentFragment docFrag(&richTextDocument); ai_cursor.insertFragment(docFrag);
Une idée ?
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager