将 MFC 转换为 QT"就地"端口 - QWinWidget 中的 QDialog 未捕获 Ctrl-X、Ctrl-V 等

WIndows MFC to QT 'in-place' port - QDialog inside QWinWidget not catching Ctrl-X, Ctrl-V etc

本文关键字:QDialog Ctrl-X Ctrl-V 中的 QWinWidget 转换 MFC QT 就地 端口      更新时间:2023-10-16

我正在将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");
}

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

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;
}