激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - C/C++ - MFC程序中使用QT開發(fā)界面的實現(xiàn)步驟

MFC程序中使用QT開發(fā)界面的實現(xiàn)步驟

2022-03-11 13:58aluluka C/C++

本文主要介紹了MFC程序中使用QT開發(fā)界面的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

如果你有一個現(xiàn)成的MFC項目在做維護(hù),但是你厭倦了使用MFC繁瑣的操作來做界面美化,或者你需要在這個項目中用到QT里面好用的某些功能;亦或者是你需要使用某些只能在MFC中使用的組件,但是界面這部分已經(jīng)用QT做好了。

演示環(huán)境使用Visual Studio 2019 + QT5.12.8 版本

 

添加QT依賴

首先創(chuàng)建一個基于對話框的MFC工程,當(dāng)然其他的像是多文檔、單文檔工程也是可以的,只是為了簡單起見我這里用的是對話框
然后通過鼠標(biāo)右鍵點(diǎn)擊項目,然后依次點(diǎn)擊屬性 --> C/C++ -->常規(guī)在工程的附加頭文件中添加上QCore、QGui、QWidget和QT的頭文件路徑

MFC程序中使用QT開發(fā)界面的實現(xiàn)步驟

MFC程序中使用QT開發(fā)界面的實現(xiàn)步驟

這里記得按照對應(yīng)編譯選項來選擇包含64位或者32。
接著在連接器–>常規(guī) 中的附加庫目錄中添加qt的lib庫

MFC程序中使用QT開發(fā)界面的實現(xiàn)步驟

MFC程序中使用QT開發(fā)界面的實現(xiàn)步驟

最后再在連接器–>輸入中添加依賴的lib文件,需要注意的是,debug版本需要鏈接上帶d的lib文件,release則鏈接上不帶d的。
MFC程序中使用QT開發(fā)界面的實現(xiàn)步驟
先編譯一下,如果沒有問題,qt相關(guān)的配置已經(jīng)完成了

 

添加信號槽機(jī)制

MFC是基于Windows 消息隊列來處理和響應(yīng)ui事件的,而qt是采用信號槽機(jī)制來響應(yīng)的,我們雖然添加了qt的依賴,但是現(xiàn)在只能使用其他的qt庫,無法使用qt中的信號槽,需要額外添加一些組件來使mfc支持信號槽。

好在這部分需求qt相關(guān)的研發(fā)人員已經(jīng)考慮到了,可以在github中找到 QMfcApp
我們可以將這兩個文件給拷貝下來,添加到項目中。并且在cpp文件相應(yīng)位置添加上 #include "pch.h"包含預(yù)處理頭

中間會有報錯,這是因為在Unicode 字符集下 CString 中的字符串類型是 wchar_t* QString::fromLocal8bit 無法 從 wchar_t* 轉(zhuǎn)化為 char* 所以這里可以修改一下,使用 QString::fromStdWString(),然后進(jìn)行編譯

在QMfcApp.cpp的注釋里面可以看到,如何使用它

/*!
  Creates an instance of QApplication, passing the command line of
  \a mfcApp to the QApplication constructor, and returns the new
  object. The returned object must be destroyed by the caller.

  Use this static function if you want to perform additional
  initializations after creating the application object, or if you
  want to create Qt GUI elements in the InitInstance()
  reimplementation of CWinApp:

  \code
  BOOL MyMfcApp::InitInstance()
  {
  // standard MFC initialization
  // ...

  // This sets the global qApp pointer
  QMfcApp::instance(this);

  // Qt GUI initialization
  }

  BOOL MyMfcApp::Run()
  {
  int result = QMfcApp::run(this);
  delete qApp;
  return result;
  }
  \endcode

  \sa run()
*/

首先在app類的InitInstance 函數(shù)中初始化QApplication類

BOOL CMFCWithQtApp::InitInstance()
{
	CWinApp::InitInstance();
	QMfcApp::instance(this);
	return true;
}

然后需要重寫 app類的run 方法,在該方法中調(diào)用QMFC 的run方法

int CMFCWithQtApp::Run()
{
	int result = QMfcApp::run(this);
	delete qApp;
	return result;
}

再次編譯一下,完成了往mfc中添加信號槽機(jī)制的功能

 

添加qt界面

在項目中新建一個界面類,讓他繼承自QWidget,如下

// MainUI.h
#pragma once
#include <QWidget>

class MainUI: public QWidget
{
	Q_OBJECT
public:
	MainUI(QWidget* parent = nullptr);
	~MainUI();
};

//MainUI.cpp
#include "pch.h"
#include "MainUI.h"
#include <QPushButton>

MainUI::MainUI(QWidget* parent) :
	QWidget(parent)
{
	setWindowTitle("Qt Windows");
	setFixedSize(800, 720);

	QPushButton* pBtn = new QPushButton(QString::fromLocal8Bit("這是一個Qt按鈕"), this);
}


MainUI::~MainUI()
{

}

然后在App 類的 InitInstance 中啟動該界面

BOOL CMFCWithQtApp::InitInstance()
{
	CWinApp::InitInstance();
	QMfcApp::instance(this);

	MainUI ui;
	ui.show();
	QMfcApp::exec();
	return FALSE;
}

然后編譯,這個時候發(fā)現(xiàn)會在鏈接的時候包一些錯誤,找不到一些 meta 的函數(shù)的定義

 

配置元編譯過程

傳統(tǒng)的c/c++ 從源代碼到生成可執(zhí)行文件的過程需要經(jīng)過預(yù)編譯、編譯、鏈接。而qt在預(yù)編譯前會進(jìn)行元編譯,生成一個moc_開頭的源碼文件,后續(xù)編譯的真正的文件其實是這個元編譯生成的文件。MFC項目不會經(jīng)歷這一步,所以會報錯。

在MainUI.h 上點(diǎn)擊右鍵,選擇屬性, 將項目類型選擇為自定義生成工具
MFC程序中使用QT開發(fā)界面的實現(xiàn)步驟
然后應(yīng)用,這個時候會出現(xiàn)新的選項
MFC程序中使用QT開發(fā)界面的實現(xiàn)步驟
在命令行和輸入這兩欄中分別填入 "moc.exe" "%(FullPath)" -o ".\GeneratedFiles\moc_%(Filename).cpp" "-fpch.h" "-f../MainUI.h" 和 .\GeneratedFiles\moc_%(Filename).cpp

命令行的含義是會使用moc元編譯器編譯當(dāng)前文件,并將生成的文件放入到當(dāng)前目錄下的GeneratedFiles子目錄中,并且以moc_開頭作為文件名,后面 -f 表示生成的新文件中會包含 #include "pch.h" 和 #include "../MainUI.h"

然后在文件中選擇右鍵,編譯。這樣將會生成moc文件(兩邊的雙引號也好包含進(jìn)去)

如果編譯的時候報找不到moc.exe 這樣的錯誤,請配置QT中的bin路徑到環(huán)境變量中

我們將新生成的文件添加到項目中

MFC程序中使用QT開發(fā)界面的實現(xiàn)步驟

再次編譯,成功過后點(diǎn)擊運(yùn)行就可以看到qt界面已經(jīng)展示出來了

MFC程序中使用QT開發(fā)界面的實現(xiàn)步驟

 

一些問題的處理

窗口出來了,但是在我的環(huán)境下出現(xiàn)兩個問題,關(guān)閉窗口后進(jìn)程無法退出;程序退出后出現(xiàn)內(nèi)存泄露的問題

針對這兩個問題可以在QMfcApp.cpp 文件中修改

// 表示在最后一個qt窗口退出時,關(guān)閉QApplication
setQuitOnLastWindowClosed(true); //將之前的false改為true
// ~QMfcApp() 中添加這兩句,當(dāng)析構(gòu)完成后關(guān)閉進(jìn)程
HANDLE hself = GetCurrentProcess();
TerminateProcess(hself, 0);

 

測試信號槽

我們可以在MainUI中添加信號槽

MainUI::MainUI(QWidget* parent) :
	QWidget(parent)
{
	setWindowTitle("Qt Windows");
	setFixedSize(800, 720);

	QPushButton* pBtn = new QPushButton(QString::fromLocal8Bit("這是一個Qt按鈕"), this);
	connect(pBtn, &QPushButton::clicked, [=]() {
		QMessageBox::information(this, QString::fromLocal8Bit("信號槽"), QString::fromLocal8Bit("這是由信號槽彈出來的"));
		});
}

點(diǎn)擊按鈕之后,消息框也正常彈出來了

MFC程序中使用QT開發(fā)界面的實現(xiàn)步驟

 

使用qt designer 設(shè)計界面

使用 qtdesigner 設(shè)計這樣一個界面

MFC程序中使用QT開發(fā)界面的實現(xiàn)步驟
qtdesigner 會生成一個.ui文件,在qt的開發(fā)環(huán)境中,會自動使用uic.exe 將這個文件生成一個對應(yīng)的.h文件。我們先將ui文件導(dǎo)入到項目,并且按照之前的步驟設(shè)置自定義生成工具,填入如下命令行

"uic.exe" "%(FullPath)" -o ".\ui_%(Filename).h"

并且填寫上輸出路徑.\ui_%(Filename).h

編譯之后會生成一個對應(yīng)的ui_MainUi.h 文件,修改對應(yīng)的MainUI.h 頭文件,加上關(guān)于它的引用,并且添加一個ui的對象指針

//MainUI.h
#pragma once
#include <QWidget>
#include "ui_Main.h"

class MainUI: public QWidget
{
	Q_OBJECT
public:
	MainUI(QWidget* parent = nullptr);
	~MainUI();

private:
	Ui::mainUI* m_pUI;
};

在類的構(gòu)造中,使用ui對象來產(chǎn)生界面元素

//MainUI.cpp
#include "pch.h"
#include "MainUI.h"
#include <QPushButton>
#include <QMessageBox>

MainUI::MainUI(QWidget* parent) :
	QWidget(parent),
	m_pUI(new Ui::mainUI())
{
	m_pUI->setupUi(this);

	connect(m_pUI->pushButton, &QPushButton::clicked, [=]() {
		QMessageBox::information(this, QString::fromLocal8Bit("qt 信號槽測試"), m_pUI->lineEdit->text());
		});
}

MainUI::~MainUI()
{
	delete m_pUI;
}

執(zhí)行效果如下

MFC程序中使用QT開發(fā)界面的實現(xiàn)步驟

到此這篇關(guān)于MFC程序中使用QT開發(fā)界面的實現(xiàn)步驟的文章就介紹到這了,更多相關(guān)MFC QT開發(fā)界面內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://blog.csdn.net/lanuage/article/details/121850149

延伸 · 閱讀

精彩推薦
  • C/C++C語言實現(xiàn)電腦關(guān)機(jī)程序

    C語言實現(xiàn)電腦關(guān)機(jī)程序

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)電腦關(guān)機(jī)程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C/C++經(jīng)典實例之模擬計算器示例代碼

    C/C++經(jīng)典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關(guān)于C/C++經(jīng)典實例之模擬計算器的相關(guān)資料,文中通過示...

    jia150610152021-06-07
  • C/C++c++ 單線程實現(xiàn)同時監(jiān)聽多個端口

    c++ 單線程實現(xiàn)同時監(jiān)聽多個端口

    這篇文章主要介紹了c++ 單線程實現(xiàn)同時監(jiān)聽多個端口的方法,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++學(xué)習(xí)C++編程的必備軟件

    學(xué)習(xí)C++編程的必備軟件

    本文給大家分享的是作者在學(xué)習(xí)使用C++進(jìn)行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++深入理解goto語句的替代實現(xiàn)方式分析

    深入理解goto語句的替代實現(xiàn)方式分析

    本篇文章是對goto語句的替代實現(xiàn)方式進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下...

    C語言教程網(wǎng)7342020-12-03
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數(shù)使用

    詳解c語言中的 strcpy和strncpy字符串函數(shù)使用

    strcpy 和strcnpy函數(shù)是字符串復(fù)制函數(shù)。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數(shù)使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內(nèi)存中的數(shù)據(jù)都是暫時的,當(dāng)程序結(jié)束時,它們都將丟失,為了永久性的保存大量的數(shù)據(jù),C語言提供了對文件的操作,這篇文章主要給大家介紹了關(guān)于C語言中文件...

    針眼_6702022-01-24
主站蜘蛛池模板: 亚洲第一色婷婷 | 黄色免费在线电影 | 双性帝王调教跪撅打屁股 | 九九综合九九 | 欧美顶级毛片在线播放小说 | 久久精品一二三区白丝高潮 | 色悠悠久久久久 | 99精品视频一区二区三区 | www久久综合 | 国产在线观看免费视频软件 | 免费在线观看国产精品 | 天天艹综合 | 999精品久久久 | 国产精品久久久久无码av | 主人在调教室性调教女仆游戏 | 免费在线观看亚洲 | 蜜桃精品视频 | 精品在线视频播放 | 成人国产精品久久 | 91成人久久 | 久久777国产线看观看精品 | 亚洲国产美女视频 | xnxx 美女19 | 国产1区2区3区中文字幕 | 羞羞视频免费入口网站 | 91成人一区二区三区 | 亚洲欧美国产高清va在线播放 | 毛片视频网站在线观看 | 悠悠成人资源亚洲一区二区 | 国产亚洲精品久久午夜玫瑰园 | 亚洲码无人客一区二区三区 | 91久久极品少妇韩国 | 久久精品一二三区白丝高潮 | 国产一区二区久久精品 | 日韩av有码在线 | 久久激情小视频 | 深夜网站在线观看 | 国产免费传媒av片在线 | 2017亚洲男人天堂 | 国产精品爆操 | 91精品国产综合久久久动漫日韩 |