QWinWidget内部MFC对话框不重绘或响应Tab /箭头键

时间:2009-06-30 21:31:14

标签: c++ qt mfc qt-mfc-migration

我在MFC对话框中使用QWinWidget并且QWinWidget没有正确绘制,并且没有正确处理键盘输入。

重新绘制[未解决]

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

由于这个QWinWidget位于MFC CDialog中,我尝试重写CDialog的OnPaint方法并且只调用QWinWidget :: repaint方法,但这有相反的问题,现在只更新QWinWidget而且CDialog永远不会被重绘,导致文物。如果我调用QWinWidget :: repaint和CDialog :: OnPaint,结果与不覆盖OnPaint方法的结果相同。有没有人见过这个问题或知道如何解决它?

键盘输入[已解决]

QWinWidget中的所有控件都没有正确响应Tab键或箭头键。选项卡/箭头键只是跳过整个QWinWidget(以及所有子控件)。即使我在QWinWidget内部单击并选择一个控件,下次我按Tab键时,它会完全跳过整个QWinWidget。

我注意到QWinWidget有两个函数,QWinWidget :: focusNextPrevChild和QWinWidget :: focusInEvent,它们都有一个注释标题“\ reimp”。我是否应该覆盖这些功能以获得正确的标签功能?如果是这样,如何实现这些功能以实现正确的标签功能。

4 个答案:

答案 0 :(得分:3)

我修复了键盘输入问题。 QWinWidget类需要进行一些更改:

在QWinWidget :: init方法中,必须将WS_TABSTOP添加到窗口样式中:

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

此外,QWinWidget :: winEvent方法需要响应WM_GETDLGCODE,让Windows知道它有兴趣接收键/标签输入。如果阻止我必须添加这个:

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

我仍在努力让小部件正确绘画。

答案 1 :(得分:1)

我不知道您是否需要重新实现focusNextPrevChild()focusInEvent()函数,但我知道注释标题中的“\ reimp”是Qt文档生成的一部分,仅指定该函数是父类中另一个函数的重新实现。

答案 2 :(得分:0)

不知道键盘输入,但关于重新绘制:你是否尝试在CDialog的OnPaint方法中调用QWinWidget :: repaint() AFTER 调用CDialog :: OnPaint()?

答案 3 :(得分:0)

谢谢!这个对我有用!我已经为QWinWidget中的QTableView修复了箭头键导航问题。 我使用的是Qt5.3.0和qtwinmigrate 2.8。 需要修改QWinWidget :: nativeEvent方法。

#if QT_VERSION >= 0x050000
bool QWinWidget::nativeEvent(const QByteArray &, void *message, long *result)
#else
...
{
    ...
    if (msg->message == WM_SETFOCUS) {
        ...
    } else if (msg->message == WM_GETDLGCODE) {
        *result = DLGC_WANTALLKEYS;
        return true;
    }

    return false;
}