Qtコアコンポーネント/ウィジェットの変更、ベストプラクティス? [閉まっている]
質問
ページ番号(フッターのどこかに)を表示できるようにすることで、QtのQPrintPreviewWidgetを強化しようとしています。残念ながら、Qtのソースをハッキングせずにそれを実行する方法はわかりません。この追加コード(newpaint()メソッドのqpaintengine_preview.cpp)に最適な場所がありますが、それはQt全体を再コンパイルする必要があることを意味します(Trolltechからバイナリビルドを取得しました)。さらに、他の誰かのボックスでこの機能を使用するアプリを実行することに決めた場合は、そこでも再コンパイルする必要があります(別のアーチの場合など)。
他のクリーンな方法はありますか?
ありがとう
解決
newPage()メソッドは仮想ですか?もしそうなら、サブクラスを作成して自分のアプリケーションで使用することができます。これは少し簡単です。
2番目のオプションは、実行可能ファイルを変更されたQtライブラリに静的にリンクすることです。これを行うには、ライセンスの問題に注意する必要があります。このように、アプリを配置するすべての場所に変更された機能があります。 (まだ、異なるアーキテクチャ用に再コンパイルする必要があります。)
最後に、 http://qt.gitorious.org/ から最新のソースを入手できます。あなたが望むようにそれらを修正し、トロールにパッチを提出してください。これを行う場合、おそらく古い動作をデフォルトのままにし、新しい動作を有効にするオプションを追加する必要があります。彼らは、パッチを受け入れる場合と受け入れない場合があります。そして、もし彼らがパッチを受け入れたとしても、他の人のコンピューターがそのバージョンを入手するのを、かなり長い間信頼できないかもしれません。
他のヒント
ソースコードを読む。
この場合、 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
の代わりに派生ウィジェットを使用します。
今、すでにデプロイされているバイナリのウィジェットの動作を変更したい場合、事態はugくなります。この場合、私は助けられません。
ライブラリがあり、このライブラリに実行時にリンカーが探している同じシンボルがある場合(印刷プレビューのコードを取得するため)、独自のコードを挿入して実際の実装を置き換えることができます。メソッドはdllインジェクションと呼ばれます。
詳細については、 http://en.wikipedia.org/wiki/DLL_injection を確認してください。