代码之家  ›  专栏  ›  技术社区  ›  Andrew Garrison

MFC对话框内的QWinWidget未重新绘制或响应Tab键/箭头键

  •  4
  • Andrew Garrison  · 技术社区  · 17 年前

    QWinWidget

    重新涂漆[未解决]

    由于此QWinWidget位于MFC CDialog中,我尝试重写CDialog的OnPaint方法,只调用QWinWidget::reflect方法,但这有相反的问题,现在只有QWinWidget被更新,CDialog永远不会被重新绘制,从而导致伪影。如果我调用QWinWidget::reflect和CDialog::OnPaint,结果与不重写OnPaint方法相同。有人见过这个问题或知道如何解决吗?

    键盘输入[已解决]

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

    4 回复  |  直到 17 年前
        1
  •  3
  •   Andrew Garrison    17 年前

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

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

        2
  •  1
  •   Caleb Huitt - cjhuitt    17 年前

    focusNextPrevChild() focusInEvent() 函数,但我知道注释头中的“\reimp”是Qt文档生成的一部分,它只是指定该函数是父类中另一个函数的重新实现。

        3
  •  0
  •   fretje    17 年前

    谢谢!它对我有效!我已经修复了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;
    }
    
        4
  •  0
  •   Dmitry Grigorovich    10 年前

    不知道键盘输入,但关于重新绘制:你试过在CDialog的OnPaint方法中调用QWinWidget::reject()吗 之后 调用CDialog::OnPaint()?

    推荐文章