最近需要搞懂一個事情,就是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。歡迎大家討論