一、 Qt库调用MFC模块对话框
- QT调用模态对话框属于资源类,需要在导出函数中开头增加
AFX_MANAGE_STATE(AfxGetStaticModuleState());
- 对于从MFC EXE文件中转过来的Dll,需要注意的是app类中的初始化函数调用模态对话框的相关代码注释掉,并返回TRUE
- 使用向导添加一个MFC的动态库,如取名为MFCLibrary1
- 添加一个对话框资源,并在对话框设计界面添加一个MFC界面类如CTestDialog
class CTestDialog : public CDialogEx
{
DECLARE_DYNAMIC(CTestDialog)
public:
CTestDialog(CWnd* pParent = nullptr); // 标准构造函数
virtual ~CTestDialog();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum {
IDD = IDD_DIALOG1 };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedOk();
};
- 添加导出类(在工程项目中添加对应的导出宏定义 TEST_EX)
//
#pragma once
#ifdef TEST_EX
#define TEST_SDK __declspec(dllexport)
#else
#define TEST_SDK __declspec(dllimport)
#endif
class TEST_SDK TestExport
{
public:
void showDialog()
{
//下面这句号一定加,否则QT调用会报(afxwin1.inl 第21行的错误)
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//启动模态对话框;
CTestDialog dlg;
dialog.DoModal();
}
};
- 在Qt中调用
与普通的正常程序调用没有任何区别
QObject::connect(ui.pushButton, &QPushButton::clicked, []()
{
TestExport test;
test.showDialog();
});
- 成果展示
二、Qt库嵌入MFC对话框控件
- MFCLibrary1动态库相关功能基本类似
- 给TestExport类增加一个获取对话框窗口句柄的方法
CTestDialog* dialog = new CTestDialog();
void* TestExport::getDialogHandle()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//将对话框当成控件用;
dialog->Create(IDD_DIALOG1);
dialog->ShowWindow(SW_SHOW);
dialog->DoModal();
return dialog->GetSafeHwnd();
}
- qt程序接入MFC控件
QObject::connect(ui.pushButton, &QPushButton::clicked, [=]()
{
TestExport test;
void* handle = test.getDialogHandle();
if(handle)
{
auto m_window = QWindow::fromWinId((WId)handle);
m_window->setFlags(m_window->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint);
auto mWidget = QWidget::createWindowContainer(m_window);
this->setCentralWidget(mWidget);
}
});
- 成果展示