Modification des composants / widgets principaux de Qt, meilleures pratiques? [fermé]

StackOverflow https://stackoverflow.com/questions/1800272

  •  05-07-2019
  •  | 
  •  

Question

J'essaie d'améliorer QPrintPreviewWidget de Qt en lui permettant d'afficher les numéros de page (quelque part dans le pied de page). Malheureusement, je n'arrive pas à comprendre comment s'y prendre sans fouiller la source de Qt. Je vois un endroit idéal pour ce code supplémentaire (dans la méthode qpaintengine_preview.cpp, dans la méthode newPage ()), mais cela signifie que je vais devoir recompiler l'intégralité de Qt (j'ai obtenu une version binaire de Trolltech). De plus, si je décide de lancer une application qui utilise cette fonctionnalité sur la boîte de quelqu'un d'autre, je devrai également la recompiler (par exemple, s'il s'agit d'une arche différente).

Existe-t-il d'autres méthodes plus propres?

Merci

Était-ce utile?

La solution

La méthode newPage () est-elle virtuelle? Si tel est le cas, vous pouvez sous-classer et utiliser cela dans vos propres applications, ce qui serait un peu plus facile.

La deuxième option consisterait à lier statiquement votre exécutable aux bibliothèques Qt modifiées. Vous devez être conscient des problèmes de licence pour le faire. De cette façon, chaque fonctionnalité de votre application sera modifiée. (Vous devrez toujours recompiler différentes architectures.)

Enfin, vous pouvez obtenir les dernières sources auprès de http://qt.gitorious.org/ , modifiez-les comme vous le souhaitez et soumettez un correctif 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 d'autres personnes pour obtenir cette version pendant un certain temps, voire jamais.

Autres conseils

Lisez le code source.

Dans ce cas, lisez le code source QPrintPreviewDialog pour voir comment il le fait. Cette boîte de dialogue standard comporte des boutons de navigation et une page en cours. Elle fait donc ce que vous voulez (c’est-à-dire si je comprends vraiment ce que vous voulez accomplir). Les méthodes que vous recherchez sont les suivantes (src / gui / dialogues / qprintpreviewdialog.cpp):

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

Fondamentalement, _q_previewChanged () est connecté au signal QPrintPreviewWidget :: previewChanged () . Lors de son émission, le numéro de page est mis à jour avec les informations acquises dans QPrintPreviewWidget :: currentPage () et QPrintPreviewWidget :: pageCount () .

En ce qui concerne l'extension du comportement de QPrintPreviewWidget , vous pouvez essayer deux approches. Aucune version personnalisée de Qt:

Étendre QPrintPreviewWidget

Dans le constructeur, accédez au layout () (il s’agit d’un QVBoxLayout utilisé de manière interanale), ajoutez le widget de 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 présentation pour être présente et constituer un QVBoxLayout . Comme cela est en quelque sorte privé, cela peut rompre avec les nouvelles versions.

Créer une nouvelle classe prolongeant QWidget ou QFrame

Si vous n'avez pas besoin que votre widget soit un QPrintPreviewWidget , créez simplement une nouvelle classe dérivée QWidget et ajoutez le widget d'aperçu avant impression et le pied de page à une mise en page. connecte les logements, etc. Utilisez votre widget dérivé au lieu de QPrintPreviewWidget .

Désormais, si vous souhaitez modifier le comportement du widget sur des fichiers binaires déjà déployés, les choses se compliquent. Je ne peux pas aider dans ce cas.

Si vous avez une bibliothèque et que cette bibliothèque a les mêmes symboles que l'éditeur de liens que le moteur de recherche recherche (pour obtenir le code de l'aperçu avant impression), vous pouvez alors injecter votre propre code pour remplacer la véritable implémentation. La méthode s'appelle injection de dll.

Consultez http://en.wikipedia.org/wiki/DLL_injection pour plus d'informations.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top