MFC Ribbon UI + QT 混合编程的官方标准做法

将QtWinMigrate库代码添加的MFC/Ribbon项目,可以很完美的实现MFC与QT混合编程。前述库代码可以从CSDN下载到。

下面为代码主要的地方:

1. WinApp.h

#include "Migrate/qmfcapp.h" // <---

class CMfcQtTestApp : public CWinAppEx
{
public:
	CMfcQtTestApp() noexcept;


// 重写
public:
	virtual BOOL InitInstance();
	virtual int ExitInstance();

// 实现
	UINT  m_nAppLook;
	BOOL  m_bHiColorIcons;

	virtual void PreLoadState();
	virtual void LoadCustomState();
	virtual void SaveCustomState();

	afx_msg void OnAppAbout();
	DECLARE_MESSAGE_MAP()

	virtual int Run();
};

extern CMfcQtTestApp theApp;

2. WinApp.cpp

QMfcApp* _qApp = nullptr;

CMfcQtTestApp::CMfcQtTestApp() noexcept // <---
{
	int argc = 0;
	_qApp = new QMfcApp(argc, nullptr);
	_qApp->mfc_app = this;

	m_bHiColorIcons = TRUE;
	m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_ALL_ASPECTS;
	SetAppID(_T("MfcQtTest.AppID.NoVersion"));
    //...
}

int CMfcQtTestApp::Run() 
{
	int ret = _qApp->exec();
	delete _qApp;
	ExitInstance(); //needed
	return ret;
}

3. 实际我测试了在对话框里嵌入QT Widget,代码主要点如下

class CMyTestDlg : public CDialogEx
{
	DECLARE_DYNAMIC(CMyTestDlg)

public:
	CMyTestDlg(CWnd* pParent = nullptr);   // 标准构造函数
	virtual ~CMyTestDlg();

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_DIALOG1 };
#endif

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

	DECLARE_MESSAGE_MAP()
public:
	virtual BOOL OnInitDialog();
	afx_msg void OnDestroy();

	QWinWidget* widget; // <---
};



BOOL CMyTestDlg::OnInitDialog() // <---
{
	CDialogEx::OnInitDialog();

	CRect rc;
	GetClientRect(rc);
	ClientToScreen(rc);

	widget = new QWinWidget(this);
	widget->setFixedSize(QSize(rc.Width(), rc.Height()));

	QVBoxLayout *hbox = new QVBoxLayout(widget);
	QLabel *label = new QLabel("<h2><i>Hello, </i><font color=red>I'm QT!</font><font color=blue> Enter text:</font></h2>", widget);
	QLineEdit *edit = new QLineEdit(widget);
	edit->setClearButtonEnabled(true);
	hbox->addWidget(label);
	hbox->addWidget(edit);

	widget->setLayout(hbox);

	CRect rcw;
	GetWindowRect(rcw);
	rc.OffsetRect(-rcw.TopLeft());
	widget->move(rc.left, rc.top);

	widget->show();


	return TRUE;  // return TRUE unless you set the focus to a control
				  // 异常: OCX 属性页应返回 FALSE
}

void CMyTestDlg::OnDestroy()
{
	__super::OnDestroy();
	delete widget;     // <---
	widget = nullptr;
}

4. 下面为实际运行结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值