關於QT動態庫,利用動態庫導入界面(實例)

    最近需要搞懂一個事情,就是QT如何用使用動態庫。我們需要解決以下幾個問題:

1.有時候我們不希望在當前工程下設計界面,而是希望把界面做成一個動態鏈接庫,然後主程序調用這個動態鏈接庫,然後主程序把這個動態庫中包含的界面show出來。

2.我們希望進行插件式開發,也就是說,把你設計好的界面放到Designer中,然後從Designer拖放到ui中。這種方式生成的插件只能在QtDesigner中使用,卻不能在Qt Creator中使用,因爲現在使用的Windows版本的QtCreator是使用VS的編譯器生成的,而QtCreator 中編譯項目使用的是MinGW/g++編譯器。這一點我們可以不用管。

3.我們希望寫一個方法,做成插件,然後在主程序中調用,這個插件繼承自QObject。

    

    這三種問題,筆者作爲一隻小白,都已經解決了。下面的教程有不懂的,也可以當面聯繫我QQ 498771026,隨時歡迎大家

    對於第一種,筆者自己研究了一下,一會放具體的教程上來。也可以參考博客:

     https://blog.csdn.net/chenchong_88/article/details/43374761

    對於第二種,大家請移駕:https://blog.csdn.net/lhl1124281072/article/details/80039223

    對於第三種,在QT的官方例子中已經有了,大家可以打開QtCretor直接看源碼,附一張圖。

我們需要解決的是第一種,廢話不多說。走起。

環境是VS2013+QT5.5,沒什麼好說的。

首先右鍵工程添加新項目,用QtClassLibray新建,名字隨便

屬性自動爲dll動態庫,如果不是dll就改成dll。你也可以根據需要添加一些QT的常用庫,比如QTCore什麼的,比如說筆者的如下圖。然後你會看到QT自動生成了一些文件。

有一個XXX_global.h文件

#pragma once

#include <QtCore/qglobal.h>

#ifndef BUILD_STATIC
# if defined(QTCLASSLIBRARYTEST_LIB)
#  define QTCLASSLIBRARYTEST_EXPORT Q_DECL_EXPORT
# else
#  define QTCLASSLIBRARYTEST_EXPORT Q_DECL_IMPORT
# endif
#else
# define QTCLASSLIBRARYTEST_EXPORT
#endif

這就是像普通的動態庫一樣,定義了一些輸出的宏。這個Q_DECL_EXPORT宏你也會在工程屬性裏的與處理器定義裏面找到。自動生成的文件還有一個h文件,一個CPP文件,這兩個文件就是你需要輸出的自定義的Widget了,也就是說我們只需要修改它們就行了。首先是h文件:

#pragma once

#include "qtclasslibrarytest_global.h"
#include<QtWidgets\qwidget.h>
#include<QtWidgets\qpushbutton.h>
class QTCLASSLIBRARYTEST_EXPORT QtClassLibraryTest : public QWidget
{
	Q_OBJECT

public:
	explicit QtClassLibraryTest(QWidget * parent = 0);
	~QtClassLibraryTest();

	private slots:
	void onBtnClick();

private:
	QPushButton *m_btn;
};

然後是相應的CPP:

#include "QtClassLibraryTest.h"
#include<qglobal.h>
#include<QtWidgets\qlayout.h>
#include<QtWidgets\qboxlayout.h>
#include<QtWidgets\qmessagebox.h>
QtClassLibraryTest::QtClassLibraryTest(QWidget * parent)
:QWidget(parent)
{
	this->resize(200, 200);
	QVBoxLayout*lay = new QVBoxLayout();
	
	m_btn = new QPushButton();
	QObject::connect(m_btn, SIGNAL(clicked()), this, SLOT(onBtnClick()));
	lay->addWidget(m_btn);
	this->setLayout(lay);
}

QtClassLibraryTest::~QtClassLibraryTest()
{

}

void QtClassLibraryTest::onBtnClick()
{
	QMessageBox*hehe = new QMessageBox(QMessageBox::Icon::Information, QString("hehe"), QString("ninja"));
	hehe->show();
}

很簡單的一波操作,然後生成,應該是成功的。生成了三個文件,exp、lib、dll。下面就要在主程序中用了。

新建一個主程序,MainWindow什麼的都好,然後可以自己寫一個事件來調用。

那麼我麼需要做一些預處理工作,首先是在主程序中包含頭文件,也就是你的QtClassLibraryTest.h所在的路徑:

然後要包含你生成的這個lib所在的路徑。對於筆者而言,位置如上圖所示。沒有什麼不好懂的。然後就可以在你的事件中調用了。代碼這樣就行:


	QtClassLibraryTest*hehe = new QtClassLibraryTest();
	hehe->show();

生成成功,然後調用

都沒有問題。

有任何問題可以直接聯繫本人QQ:498771026。歡迎大家討論

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章