将MFC推向QT'就地'端口 - QWinWidget里面的QDialog没有捕获Ctrl-X,Ctrl-V等

时间:2016-01-21 15:44:14

标签: c++ windows qt mfc porting

我正在将MFC应用程序移植到Qt 5.4并使用QWinWidget作为QDialog派生类的容器。一切都很好,除非我键入,例如, Ctrl + X Ctrl + V Ctrl + S 等,然后这些组合键由主MFC文档事件处理程序处理,完全绕过QT对话框。 QDialog小部件中的keyPress()事件过滤器看不到它们。

QWinWidget *win = new QWinWidget(::AfxGetApp()->m_pMainWnd);
win->showCentered();
CMyDlg dlg(win);
if (dlg.exec()) {
    QMessageBox::information(win, "ModalDialog Result", "OK");
}
else {
    QMessageBox::information(win, "ModalDialog Result", "Cancel");
}

1 个答案:

答案 0 :(得分:1)

基本上我发现这是使用MFC中的QT窗口小部件创建模态对话框的“错误方法”。正确的方法是使用MFC CDialog并在CDialog中插入QWinWidget。

int CQTControlTestDlg::OnCreate(LPCREATESTRUCT lpCreateStruct){
    if (CDialog::OnCreate(lpCreateStruct)==-1){
        return -1;
    }
    QWinWidget *winWidget = new QWinWidget(this->m_hWnd); 
    CRect rect;
    this->GetClientRect(&rect);
    winWidget->setGeometry(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top-40);

    QHBoxLayout *layout = new QHBoxLayout;  
    layout->addWidget(widget_);  
    winWidget->setLayout(layout);
    winWidget->move(0,0);     
    winWidget->show(); 
    return 0;
}