1. 程式人生 > >關於QT動態庫,利用動態庫匯入介面(例項)

關於QT動態庫,利用動態庫匯入介面(例項)

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

1.有時候我們不希望在當前工程下設計介面,而是希望把介面做成一個動態連結庫,然後主程式呼叫這個動態連結庫,然後主程式把這個動態庫中包含的介面show出來。

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

3.我們希望寫一個方法,做成外掛,然後在主程式中呼叫,這個外掛繼承自QObject。

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

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

    對於第三種,在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。歡迎大家討論