1

QtのQPrintPreviewWidgetを(フッターのどこかに)ページ番号を表示できるようにすることで拡張しようとしています。残念ながら、Qtのソースをハックせずにそれを実行する方法を完全に理解することはできません。この追加コード(qpaintengine_preview.cpp、newPage()メソッド)には最適な場所がありますが、それはQt全体を再コンパイルする必要があることを意味します(Trolltechからバイナリビルドを入手しました)。さらに、他の人のボックスでこの機能を使用するアプリを実行することにした場合は、そこでも再コンパイルする必要があります(たとえば、別のアーチの場合)。

他にもっときれいな方法はありますか?

ありがとう

4

3 に答える 3

2

newPage() メソッドは仮想ですか? もしそうなら、それをサブクラス化して、自分のアプリケーションで使用することができます。これは少し簡単です。

2 番目のオプションは、実行可能ファイルを変更した Qt ライブラリに静的にリンクすることです。これを行うには、ライセンスの問題に注意する必要があります。このようにして、アプリを配置するすべての場所に、変更された機能が含まれます。(異なるアーキテクチャ用に再コンパイルする必要があります。)

最後に、最新のソースをhttp://qt.gitorious.org/から入手し、必要に応じて変更して、トロールにパッチを提出することができます。これを行う場合、おそらく古い動作をデフォルトのままにして、新しい動作を有効にするオプションを追加する必要があります。彼らはパッチを受け入れるかもしれないし、受け入れないかもしれません。そして、彼らがパッチを受け入れたとしても、他の人のコンピュータがそのバージョンを入手することに、たとえあったとしても、かなりの期間、頼ることができないかもしれません。

于 2009-11-26T14:53:08.790 に答える
1

ソースコードを読んでください。

この場合、QPrintPreviewDialogソースコードを読んでそれがどのように行われるかを確認してください。この標準ダイアログにはナビゲーションボタンと現在のページ表示があるので、あなたが望むことを実行します(つまり、私があなたが達成したいことを本当に理解している場合)。探しているメソッドは次のとおりです(src / gui / dialogs / qprintpreviewdialog.cpp):

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

基本的に、信号_q_previewChanged()に接続されていQPrintPreviewWidget::previewChanged()ます。放出されると、ページ番号はとから取得した情報で更新されQPrintPreviewWidget::currentPage()ますQPrintPreviewWidget::pageCount()

動作を拡張することに関してはQPrintPreviewWidget、2つのアプローチを試すことができますが、どちらもQtのカスタマイズされたバージョンを必要としません。

拡張するQPrintPreviewWidget

コンストラクターで、layout()(内部で使用されるのはQVBoxLayoutです)にアクセスし、フッターウィジェットを追加しpreviewChanged()、ページ番号を更新するスロットにシグナルを接続して完了します。このアプローチの問題は、レイアウトが存在し、存在することを期待していることQVBoxLayoutです。これはどういうわけかプライベートなので、新しいバージョンでは壊れることがあります。

QWidgetまたはを拡張する新しいクラスを作成しますQFrame

ウィジェットをである必要がない場合はQPrintPreviewWidget、新しいQWidget派生クラスを作成し、印刷プレビューウィジェットとフッターをレイアウトに追加し、スロットを接続するなどします。の代わりに派生ウィジェットを使用しますQPrintPreviewWidget

ここで、すでにデプロイされているバイナリでウィジェットの動作を変更したい場合、状況はさらに醜くなります。この場合、私は仕方がありません。

于 2009-12-06T18:05:52.877 に答える
0

ライブラリがあり、このライブラリに実行時にリンカーが探しているのと同じシンボルがある場合(印刷プレビューのコードを取得するため)、実際の実装を置き換えるために独自のコードを挿入できます。この方法はdllインジェクションと呼ばれます。

詳細については、 http://en.wikipedia.org/wiki/DLL_injectionを確認してください。

于 2009-11-30T08:29:11.600 に答える