componentes do núcleo Modificando QT / widgets, melhores práticas? [fechadas]

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

  •  05-07-2019
  •  | 
  •  

Pergunta

Eu estou tentando melhorar QPrintPreviewWidget do Qt, permitindo que ele para exibir números de página (no lugar de rodapé). Infelizmente, eu não consigo descobrir como fazê-lo sem cortar-se fonte de Qt. Vejo um ótimo local para este código adicional (em qpaintengine_preview.cpp, em newPage método ()), mas isso significa que eu vou ter que recompilar o conjunto da Qt (Eu tenho uma compilação binária da Trolltech). Além disso, se eu decidir executar um aplicativo que usa essa funcionalidade na caixa de outra pessoa, eu vou ter que recompilar lá também (dizer se é um arco diferente).

Existem outras formas mais limpas?

Graças

Foi útil?

Solução

É o método () virtual newPage? Se assim for, você poderia subclasse e uso isso em você próprios aplicativos, o que seria um pouco mais fácil.

A segunda opção seria ligar estaticamente seu executável com as bibliotecas Qt modificados. Você precisa estar ciente de licenciamento preocupações para fazer isso. Desta forma, cada lugar que você colocar o aplicativo terá sua funcionalidade modificada. (Você ainda precisa recompilação de diferentes arquiteturas.)

Finalmente, você pode obter as últimas fontes de http://qt.gitorious.org/ , modificá-los da maneira que você deseja, e enviar uma volta patch para os trolls. Se você fizer isso, você provavelmente terá que manter o comportamento antigo padrão, e adicionar uma opção para ativar o novo comportamento. Eles podem ou não aceitar o adesivo. E se eles não aceitam o patch, você pode não ser capaz de confiar em computadores de outras pessoas recebendo essa versão por algum tempo, se alguma vez.

Outras dicas

Leia o código-fonte.

Neste caso, leia o código fonte QPrintPreviewDialog para ver como ele faz isso. Este diálogo padrão tem botões de navegação e uma exibição da página atual, de modo que tipo de faz o que quiser (ou seja, se eu realmente entendi o que você quer alcançar). Os métodos que você está procurando são as seguintes (src / gui / diálogos / qprintpreviewdialog.cpp):

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

Basicamente, _q_previewChanged() está ligado ao sinal QPrintPreviewWidget::previewChanged(). Quando é emitida, o número da página é atualizado com informações adquiridas a partir QPrintPreviewWidget::currentPage() e QPrintPreviewWidget::pageCount().

Como para estender o comportamento de QPrintPreviewWidget você pode tentar duas abordagens, ambos não requerem uma versão adaptada do Qt:

Estender QPrintPreviewWidget

No construtor, o acesso a layout() (é uma QVBoxLayout que é usado interanally), adicionar o rodapé widget, ligar o sinal previewChanged() para um slot que atualiza o número da página e ser feito. O problema com esta abordagem é que ela conta com a disposição de estar presente e ser um QVBoxLayout. Uma vez que este é de alguma forma privada, pode quebrar com as versões mais recentes.

Criar uma nova classe estendendo QWidget ou QFrame

Se você não exigir o seu widget para ser um QPrintPreviewWidget, basta criar uma nova classe QWidget derivados e adicione o widget de visualização de impressão e o rodapé para um layout, conecta ranhuras etc. Use seu derivado Widget em vez de QPrintPreviewWidget.

Agora, se você deseja modificar o comportamento do widget em binários já implantados, as coisas ficam mais feios. Eu não posso ajudar neste caso.

Se você tem uma biblioteca e esta biblioteca tem mesmos símbolos vinculador em tempo de execução está procurando - para obter o código para a visualização de impressão - então você pode injetar seu próprio código para substituir a implementação real. Método é chamado injeção de DLL.

Verifique http://en.wikipedia.org/wiki/DLL_injection para mais informações

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top