4

我在 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

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 回答
1

谢谢!这个对我有用!我已经修复了 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;
}
于 2016-02-02T08:49:54.233 回答
0

不知道键盘输入,但关于重绘:在调用 CDialog::OnPaint() 之后,您是否尝试在 CDialog 的 OnPaint 方法中调用 QWinWidget::repaint( )

于 2009-07-01T09:42:07.383 回答