最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2021年12月10日 17:02:48   作者:aluluka  
本文主要介紹了MFC程序中使用QT開發(fā)界面的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

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

添加QT依賴

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



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


在這里插入圖片描述

最后再在連接器–>輸入中添加依賴的lib文件,需要注意的是,debug版本需要鏈接上帶d的lib文件,release則鏈接上不帶d的。
在這里插入圖片描述
先編譯一下,如果沒有問題,qt相關(guān)的配置已經(jīng)完成了

添加信號槽機(jī)制

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

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

中間會有報(bào)錯(cuò),這是因?yàn)樵赨nicode 字符集下 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界面

在項(xiàng)目中新建一個(gè)界面類,讓他繼承自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("這是一個(gè)Qt按鈕"), this);
}


MainUI::~MainUI()
{

}

然后在App 類的 InitInstance 中啟動(dòng)該界面

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

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

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

配置元編譯過程

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

MainUI.h 上點(diǎn)擊右鍵,選擇屬性, 將項(xiàng)目類型選擇為自定義生成工具

然后應(yīng)用,這個(gè)時(shí)候會出現(xiàn)新的選項(xiàng)
在這里插入圖片描述
在命令行和輸入這兩欄中分別填入 "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)去)

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

我們將新生成的文件添加到項(xiàng)目中

在這里插入圖片描述

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

一些問題的處理

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

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

// 表示在最后一個(gè)qt窗口退出時(shí),關(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("這是一個(gè)Qt按鈕"), this);
	connect(pBtn, &QPushButton::clicked, [=]() {
		QMessageBox::information(this, QString::fromLocal8Bit("信號槽"), QString::fromLocal8Bit("這是由信號槽彈出來的"));
		});
}

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

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

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


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

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

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

編譯之后會生成一個(gè)對應(yīng)的ui_MainUi.h 文件,修改對應(yīng)的MainUI.h 頭文件,加上關(guān)于它的引用,并且添加一個(gè)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í)行效果如下

在這里插入圖片描述

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

相關(guān)文章

  • Win11+?VS2022編譯?FFmpeg6.0?靜態(tài)庫的詳細(xì)過程

    Win11+?VS2022編譯?FFmpeg6.0?靜態(tài)庫的詳細(xì)過程

    這篇文章主要介紹了Win11+VS2022編譯FFmpeg6.0靜態(tài)庫的方法,本文通過圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • C語言判斷大小端的兩種方法

    C語言判斷大小端的兩種方法

    大小端的問題在很多面試筆試中都會遇到,本文主要介紹了C語言判斷大小端的兩種方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • c++ bitset詳解

    c++ bitset詳解

    這篇文章主要介紹了C++ bitset用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • Qt?事件處理機(jī)制的深入理解

    Qt?事件處理機(jī)制的深入理解

    本文主要介紹了Qt?事件處理機(jī)制的深入理解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Linux?C/C++?timeout命令實(shí)現(xiàn)運(yùn)行具有時(shí)間限制功能

    Linux?C/C++?timeout命令實(shí)現(xiàn)運(yùn)行具有時(shí)間限制功能

    inux?timeout命令的一個(gè)屬性是時(shí)間限制??梢詾槿魏蚊钤O(shè)置時(shí)間限制。如果時(shí)間到期,命令將停止執(zhí)行,這篇文章主要介紹了Linux?C/C++?timeout命令實(shí)現(xiàn)(運(yùn)行具有時(shí)間限制),需要的朋友可以參考下
    2023-02-02
  • C++ vector操作實(shí)現(xiàn)

    C++ vector操作實(shí)現(xiàn)

    這篇文章主要介紹了C++ vector操作實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • opencv4.5.4+VS2022開發(fā)環(huán)境搭建的實(shí)現(xiàn)

    opencv4.5.4+VS2022開發(fā)環(huán)境搭建的實(shí)現(xiàn)

    本文主要介紹了opencv4.5.4+VS2022開發(fā)環(huán)境搭建的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C++日期類運(yùn)算符重載方式

    C++日期類運(yùn)算符重載方式

    這篇文章主要介紹了C++日期類運(yùn)算符重載方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 如何實(shí)現(xiàn)循環(huán)隊(duì)列

    如何實(shí)現(xiàn)循環(huán)隊(duì)列

    本文主要介紹了C語言循環(huán)隊(duì)列的實(shí)現(xiàn),對于數(shù)據(jù)結(jié)構(gòu)與算法的研究有所幫助,需要的朋友可以參考下
    2015-07-07
  • C語言近萬字為你講透樹與二叉樹

    C語言近萬字為你講透樹與二叉樹

    樹是計(jì)算機(jī)算法最重要的非線性結(jié)構(gòu)。因?yàn)闃淠芎芎玫孛枋鼋Y(jié)構(gòu)的分支關(guān)系和層次特性,所以在計(jì)算機(jī)科學(xué)和計(jì)算機(jī)應(yīng)用領(lǐng)域有著廣泛的應(yīng)用。這篇文章我就帶大家一起了解一下樹、二叉樹這種結(jié)構(gòu),下篇文章會重點(diǎn)向大家介紹二叉樹的遍歷算法
    2022-05-05

最新評論

连平县| 灵山县| 垫江县| 桃园县| 永吉县| 北辰区| 镇康县| 宁远县| 明光市| 宁阳县| 桦甸市| 肇庆市| 舟曲县| 石河子市| 织金县| 遂昌县| 阳原县| 彝良县| 商河县| 阿坝县| 西充县| 蚌埠市| 两当县| 前郭尔| 修文县| 翁源县| 江津市| 崇义县| 饶河县| 玛沁县| 蓝山县| 宜城市| 涿州市| 广河县| 多伦县| 县级市| 凤城市| 德保县| 仙桃市| 宁安市| 息烽县|