Domanda

Sto cercando di migliorare QPrintPreviewWidget di Qt consentendogli di visualizzare i numeri di pagina (nel piè di pagina da qualche parte). Sfortunatamente, non riesco a capire come procedere senza hackerare la fonte di Qt. Vedo un ottimo punto per questo codice aggiuntivo (in qpaintengine_preview.cpp, nel metodo newPage ()) ma ciò significa che dovrò ricompilare l'intero Qt (ho ottenuto una build binaria da Trolltech). Inoltre, se decido di eseguire un'app che utilizza questa funzionalità sulla scatola di qualcun altro, dovrò ricompilare anche lì (dire se si tratta di un arco diverso).

Ci sono altri modi più puliti?

Grazie

È stato utile?

Soluzione

Il metodo newPage () è virtuale? In tal caso, potresti sottoclassarlo e utilizzarlo nelle tue applicazioni, il che sarebbe un po 'più semplice.

La seconda opzione sarebbe quella di collegare staticamente il tuo eseguibile con le librerie Qt modificate. Per fare ciò è necessario essere consapevoli delle preoccupazioni relative alle licenze. In questo modo, ogni posto in cui inserisci l'app avrà la tua funzionalità modificata. (Dovresti comunque ricompilare per diverse architetture.)

Infine, puoi ottenere le ultime fonti da http://qt.gitorious.org/ , modificarli nel modo desiderato e inviare una patch ai troll. Se lo fai, probabilmente dovrai mantenere il vecchio comportamento come predefinito e aggiungere un'opzione per abilitare il nuovo comportamento. Possono accettare o meno la patch. E se accettano la patch, potresti non essere in grado di fare affidamento sul fatto che i computer di altre persone ottengano quella versione per un po 'di tempo, se non mai.

Altri suggerimenti

Leggi il codice sorgente.

In questo caso, leggi il codice sorgente QPrintPreviewDialog per vedere come lo fa. Questa finestra di dialogo standard ha pulsanti di navigazione e una visualizzazione della pagina corrente, quindi fa un po 'quello che vuoi (cioè, se ho davvero capito cosa vuoi realizzare). I metodi che stai cercando sono i seguenti (src / gui / dialogs / qprintpreviewdialog.cpp):

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

Fondamentalmente, _q_previewChanged () è collegato al segnale QPrintPreviewWidget :: previewChanged () . Quando viene emesso, il numero di pagina viene aggiornato con le informazioni acquisite da QPrintPreviewWidget :: currentPage () e QPrintPreviewWidget :: pageCount () .

Per quanto riguarda l'estensione del comportamento di QPrintPreviewWidget puoi provare due approcci, entrambi non richiedono una versione su misura di Qt:

Estendi QPrintPreviewWidget

Nel costruttore, accedi al layout () (è un QVBoxLayout che viene usato interanalmente), aggiungi il widget piè di pagina, collega il segnale previewChanged () a un slot che aggiorna il numero di pagina ed è fatto. Il problema con questo approccio è che conta sul layout per essere presente ed essere un QVBoxLayout . Poiché questo è in qualche modo privato, può rompersi con le versioni più recenti.

Crea una nuova classe estendendo QWidget o QFrame

Se non è necessario che il widget sia un QPrintPreviewWidget , basta creare una nuova classe derivata QWidget e aggiungere il widget di anteprima di stampa e il piè di pagina a un layout, collega slot ecc. Usa il tuo widget derivato anziché QPrintPreviewWidget .

Ora, se vuoi modificare il comportamento del widget su binari già distribuiti, le cose diventano più brutte. Non posso aiutare in questo caso.

Se hai una libreria e questa libreria ha gli stessi simboli che il linker in fase di runtime sta cercando - per ottenere il codice per l'anteprima di stampa - puoi iniettare il tuo codice per sostituire la vera implementazione. Il metodo si chiama dll injection.

Controlla http://en.wikipedia.org/wiki/DLL_injection per maggiori informazioni

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top