4

MFC ダイアログ内でQWinWidgetを使用していますが、QWinWidget 自体が正しく描画されておらず、キーボード入力を正しく処理していません。

塗り直し【未解決】

QWinWidget 内に QTableWidget があります。QTableWidget をスクロールすると、スクロールを停止するまで再描画されず、その時点ですべてが再描画されます。同様に、QTableWidget のセルに入力できます。コントロールは、上下にスクロールして強制的に再更新するまで更新されません (スクロールが停止すると再更新されます)。

この QWinWidget は MFC CDialog に格納されているため、CDialog の OnPaint メソッドをオーバーライドして QWinWidget::repaint メソッドのみを呼び出してみましたが、これには逆の問題があり、QWinWidget のみが更新され、CDialog が再描画されず、アーティファクトが発生します。 . QWinWidget::repaint と CDialog::OnPaint を呼び出すと、OnPaint メソッドをオーバーライドしないのと同じ結果になります。誰かがこの問題を見たことがありますか、それを解決する方法を知っていますか?

キーボード入力 [解決済み]

QWinWidget 内のどのコントロールも、タブ キーまたは矢印キーに正しく応答しません。タブ/矢印キーは、QWinWidget 全体 (およびすべての子コントロール) を単純にスキップします。QWinWidget 内をクリックしてコントロールを選択しても、次に Tab キーを押すと、QWinWidget 全体からフォーカスが完全にスキップされます。

QWinWidget には QWinWidget::focusNextPrevChild と QWinWidget::focusInEvent の 2 つの関数があり、どちらにも「\reimp」というコメント ヘッダーがあることに気付きました。正しいタブ機能を得るために、これらの関数をオーバーライドする必要がありますか? もしそうなら、正しいタブ機能のためにこれらの機能をどのように実装できますか。

4

4 に答える 4

4

キーボード入力の問題を修正しました。QWinWidget クラスにはいくつかの変更が必要でした:

QWinWidget::init メソッドでは、WS_TABSTOP をウィンドウ スタイルに追加する必要があります。

SetWindowLong(winId(), GWL_STYLE, WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_TABSTOP);

また、QWinWidget::winEvent メソッドは WM_GETDLGCODE に応答して、キー/タブ入力の受信に関心があることを Windows に知らせる必要があります。これを if ブロックに追加する必要がありました:

if(msg->message == WM_GETDLGCODE)
{
   *result = DLGC_WANTARROWS | DLGC_WANTTAB;
   return(true);
}

私はまだウィジェットを適切にペイントすることに取り組んでいます。

于 2009-07-06T12:47:05.383 に答える
1

focusNextPrevChild()andfocusInEvent()関数を再実装する必要があるかどうかはわかりませんが、コメント ヘッダーの「\reimp」が Qt のドキュメント生成の一部であることは知っています。親クラス。

于 2009-07-01T15:25:08.660 に答える
0

キーボード入力についてはわかりませんが、再描画についてです。CDialog:: OnPaint()を呼び出した後、CDialogのOnPaintメソッドでQWinWidget :: repaint()を呼び出してみましたか?

于 2009-07-01T09:42:07.383 に答える