關於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。歡迎大家討論