我在MFC对话框中使用了QWinWidget,并且QWinWidget无法正确绘制自身,并且无法正确处理键盘输入。

重绘(repaint)[未解决]

在QWinWidget中,我有一个QTableWidget。当我滚动QTableWidget时,它不会重新绘制自身,直到停止滚动为止,此时它会重新绘制所有内容。同样,我可以在QTableWidget中键入单元格,并且直到我通过向上或向下滚动强制它重新更新(它在滚动停止时重新更新)之前该控件才更新。

由于此QWinWidget位于MFC CDialog中,因此我尝试覆盖CDialog的OnPaint方法并仅调用QWinWidget::repaint方法,但这存在相反的问题,即现在仅更新QWinWidget,并且从未重新绘制CDialog,从而导致出现伪像。如果我调用QWinWidget::repaint和CDialog::OnPaint,则结果与不覆盖OnPaint方法相同。有没有人看过这个问题或知道如何解决?

键盘输入[已解决]

QWinWidget中的所有控件均不能正确响应Tab键或箭头键。使用Tab/箭头键可以跳过整个QWinWidget(以及所有子控件)。即使我在QWinWidget内单击并选择一个控件,下次我按Tab键时,它也会完全跳过整个QWinWidget的焦点。

我注意到QWinWidget有两个函数,QWinWidget::focusNextPrevChild和QWinWidget::focusInEvent,它们两个都有一个注释 header ,说“\reimp”。我是否应该重写这些功能以获取正确的选项卡功能?如果是这样,如何实现这些功能以实现正确的选项卡功能。

最佳答案

我已经解决了键盘输入问题。 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);
}

我仍在努力使小部件正确绘制。

10-01 20:07