2009-11-25 9 views
1

J'essaie d'améliorer QPrintPreviewWidget de Qt en lui permettant d'afficher les numéros de page (dans le pied de page quelque part). Malheureusement, je n'arrive pas à comprendre comment s'y prendre sans pirater la source de Qt. Je vois un bon endroit pour ce code supplémentaire (dans qpaintengine_preview.cpp, dans la méthode newPage()) mais cela signifie que je vais devoir recompiler l'ensemble de Qt (j'ai une version binaire de Trolltech). En outre, si je décide d'exécuter une application qui utilise cette fonctionnalité sur la boîte de quelqu'un d'autre, je vais devoir recompiler là aussi (disons que c'est une arche différente).Modification des composants/widgets de base Qt, meilleures pratiques?

Existe-t-il d'autres moyens de nettoyage?

Merci

Répondre

2

est la méthode newPage() virtuelle? Si oui, vous pourriez sous-classer et utiliser cela dans vos propres applications, ce qui serait un peu plus facile.

La deuxième option serait de lier statiquement votre exécutable avec les bibliothèques Qt modifiées. Vous devez être conscient des problèmes de licence pour ce faire. De cette façon, chaque endroit où vous mettez l'application aura vos fonctionnalités modifiées. (Vous aurez toujours besoin de recompiler pour différentes architectures.)

Enfin, vous pouvez obtenir les dernières sources de http://qt.gitorious.org/, les modifier comme vous le souhaitez et soumettre un patch aux trolls. Si vous faites cela, vous devrez probablement conserver l'ancien comportement par défaut et ajouter une option pour activer le nouveau comportement. Ils peuvent ou non accepter le patch. Et s'ils acceptent le correctif, vous ne pourrez peut-être pas compter sur les ordinateurs des autres utilisateurs pour obtenir cette version pendant un certain temps, voire jamais.

+0

Ouais c'est ce que j'ai pensé. newPage() n'est pas virtuel, et même si c'était le cas, je ne serais pas capable d'injecter ma classe dans la hiérarchie d'aperçu avant impression. Merci quand même! – EightyEight

0

Si vous avez une bibliothèque et que cette bibliothèque a les mêmes symboles que l'éditeur de liens à l'exécution recherche (pour obtenir le code de l'aperçu avant impression), vous pouvez injecter votre propre code pour remplacer l'implémentation réelle. La méthode est appelée injection dll.

Vérifier http://en.wikipedia.org/wiki/DLL_injection pour plus d'informations

1

Lire le code source.

Dans ce cas, lisez QPrintPreviewDialog le code source pour voir comment il le fait. Cette boîte de dialogue standard comporte des boutons de navigation et un affichage de page en cours, ce qui fait que vous faites ce que vous voulez (c'est-à-dire si j'ai vraiment compris ce que vous voulez accomplir). Les méthodes que vous cherchez sont les suivantes (src/IUG/dialogues/qprintpreviewdialog.cpp):

void QPrintPreviewDialogPrivate::_q_previewChanged() 
void QPrintPreviewDialogPrivate::_q_navigate(QAction* action) 
void QPrintPreviewDialogPrivate::updateNavActions() 

Fondamentalement, _q_previewChanged() est reliée au signal QPrintPreviewWidget::previewChanged(). Lorsqu'il est émis, le numéro de page est mis à jour avec les informations acquises de QPrintPreviewWidget::currentPage() et QPrintPreviewWidget::pageCount().

En ce qui concerne l'extension du comportement de QPrintPreviewWidget vous pouvez essayer deux approches, deux d'entre eux ne nécessitent pas une version adaptée de Qt:

Extend QPrintPreviewWidget

Dans le constructeur, accéder au layout() (il est un QVBoxLayout qui est utilisé interanally), ajoutez le widget pied de page, connectez le signal previewChanged() à un emplacement qui met à jour le numéro de page et être fait. Le problème avec cette approche est qu'elle compte sur la mise en page pour être présente et être un QVBoxLayout. Comme c'est en quelque sorte privé, il peut rompre avec les versions plus récentes.

Créer une nouvelle classe extension QWidget ou QFrame

Si vous ne souhaitez pas que votre widget pour être un QPrintPreviewWidget, il suffit de créer une nouvelle classe dérivée QWidget et ajouter le widget aperçu avant impression et le pied de page à une mise en page , connecte les emplacements, etc. Utilisez votre widget dérivé au lieu de QPrintPreviewWidget. Maintenant, si vous voulez modifier le comportement du widget sur les binaires déjà déployés, les choses deviennent plus laides. Je ne peux pas aider dans ce cas.