Modificación de componentes / widgets principales de Qt, ¿mejores prácticas? [cerrado]

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

  •  05-07-2019
  •  | 
  •  

Pregunta

Estoy tratando de mejorar el QPrintPreviewWidget de Qt permitiéndole mostrar números de página (en algún lugar del pie de página). Desafortunadamente, no puedo entender cómo hacerlo sin hackear la fuente de Qt. Veo un gran lugar para este código adicional (en qpaintengine_preview.cpp, en el método newPage ()) pero eso significa que tendré que volver a compilar todo Qt (obtuve una versión binaria de Trolltech). Además, si decido ejecutar una aplicación que use esta funcionalidad en la caja de otra persona, tendré que volver a compilar allí (por ejemplo, si es un arco diferente).

¿Hay alguna otra forma más limpia?

Gracias

¿Fue útil?

Solución

¿El método newPage () es virtual? Si es así, podría subclasificar y usar eso en sus propias aplicaciones, lo que sería un poco más fácil.

La segunda opción sería vincular estáticamente tu ejecutable con las bibliotecas Qt modificadas. Debe ser consciente de las preocupaciones de licencia para hacer esto. De esta manera, cada lugar donde coloque la aplicación tendrá su funcionalidad modificada. (Todavía necesitarías recompilar para diferentes arquitecturas).

Finalmente, puede obtener las últimas fuentes de http://qt.gitorious.org/ , Modifíquelos de la forma que desee y envíe un parche a los trolls. Si haces esto, probablemente tendrás que mantener el comportamiento antiguo como predeterminado y agregar una opción para habilitar el nuevo comportamiento. Pueden o no aceptar el parche. Y si aceptan el parche, es posible que no puedas confiar en que las computadoras de otras personas obtengan esa versión durante bastante tiempo, si es que alguna vez.

Otros consejos

Lee el código fuente.

En este caso, lea el código fuente de QPrintPreviewDialog para ver cómo funciona. Este cuadro de diálogo estándar tiene botones de navegación y una pantalla de página actual, por lo que hace lo que quiere (es decir, si realmente entendí lo que quiere lograr). Los métodos que está buscando son los siguientes (src / gui / dialogs / qprintpreviewdialog.cpp):

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

Básicamente, _q_previewChanged () está conectado a la señal QPrintPreviewWidget :: previewChanged () . Cuando se emite, el número de página se actualiza con la información obtenida de QPrintPreviewWidget :: currentPage () y QPrintPreviewWidget :: pageCount () .

En cuanto a extender el comportamiento de QPrintPreviewWidget , puede probar dos enfoques, ambos no requieren una versión adaptada de Qt:

Extender QPrintPreviewWidget

En el constructor, acceda al layout () (es un QVBoxLayout que se usa de manera interanual), agregue el widget de pie de página, conecte la señal previewChanged () a un ranura que actualiza el número de página y listo. El problema con este enfoque es que cuenta con el diseño para estar presente y ser un QVBoxLayout . Dado que esto es de alguna manera privado, puede romper con las versiones más nuevas.

Cree una nueva clase que extienda QWidget o QFrame

Si no requiere que su widget sea un QPrintPreviewWidget , simplemente cree una nueva clase derivada QWidget y agregue el widget de vista previa de impresión y el pie de página a un diseño, conecta ranuras, etc. Utilice su widget derivado en lugar de QPrintPreviewWidget .

Ahora, si desea modificar el comportamiento del widget en binarios ya implementados, las cosas se ponen más feas. No puedo ayudar en este caso.

Si tiene una biblioteca y esta biblioteca tiene los mismos símbolos que está buscando el enlazador en tiempo de ejecución, para obtener el código para la vista previa de impresión, puede inyectar su propio código para reemplazar la implementación real. Método se llama inyección dll.

Consulte http://en.wikipedia.org/wiki/DLL_injection para obtener más información

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top