我在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”。我是否应该覆盖这些功能以获得正确的标签功能?如果是这样,如何实现这些功能以实现正确的标签功能。
答案 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;
}