【QCustomPlot】使用方法(動態庫方式)

2023-06-19 09:00:52

說明

使用 QCustomPlot 繪相簿輔助開發時整理的學習筆記。同系列文章目錄可見 《繪相簿 QCustomPlot 學習筆記》目錄。本篇介紹 QCustomPlot 的一種使用方法,通過動態庫的方式進行使用,範例中使用的 QCustomPlot 版本為 Version 2.1.1


1. 下載原始碼

詳見本人另一篇部落格 【QCustomPlot】下載,下載 QCustomPlot-sharedlib.tar.gz 動態庫版的壓縮包,解壓后里面有個 readme.txt 檔案,介紹瞭如何編譯 QCustomPlot 動態庫以及如何使用編譯出來的動態庫,本篇部落格將以此為參考,介紹如何通過動態庫的方式使用 QCustomPlot 繪相簿。編譯動態庫時,需使用到 qcustomplot.hqcustomplot.cpp 兩個檔案。使用動態庫時,需把 qcustomplot.h 檔案及動態庫放在編譯器能找到的地方,並在相關檔案中通過 #include 的方式包含該標頭檔案,而不能在 pro/pri 檔案中通過 HEADERS += 的方式包含 qcustomplot.h ,否則會報錯。

2. 編譯動態庫

編譯動態庫時,需三個檔案:pro 檔案、qcustomplot.hqcustomplot.cpp 原始碼檔案。

2.1 編譯動態庫的工程檔案 .pro

pro 檔案用於設定動態庫的編譯方式及相關資訊,新建一個 txt 文字檔案,將以下程式碼拷貝進去,然後更改 .txt 字尾名為 .pro,就得到了所需的工程檔案,不妨將該工程檔案命名為 sharedlib-compilation.pro

QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport

greaterThan(QT_MAJOR_VERSION, 4): CONFIG += c++11
lessThan(QT_MAJOR_VERSION, 5): QMAKE_CXXFLAGS += -std=c++11

DEFINES += QCUSTOMPLOT_COMPILE_LIBRARY
TEMPLATE = lib
CONFIG += debug_and_release build_all
static {
  CONFIG += static
} else {
  CONFIG += shared
}

VERSION = 2.1.1

TARGET = qcustomplot
CONFIG(debug, debug|release) {
  TARGET = $$join(TARGET,,,d)
  QMAKE_TARGET_PRODUCT = "QCustomPlot (debug mode)"
  QMAKE_TARGET_DESCRIPTION = "Plotting library for Qt (debug mode)"
} else {
  QMAKE_TARGET_PRODUCT = "QCustomPlot"
  QMAKE_TARGET_DESCRIPTION = "Plotting library for Qt"
}
QMAKE_TARGET_COMPANY = "www.qcustomplot.com"
QMAKE_TARGET_COPYRIGHT = "Copyright (C) by Emanuel Eichhammer"

SOURCES += qcustomplot.cpp
HEADERS += qcustomplot.h

2.2 整理編譯目錄

將上面的 sharedlib-compilation.proqcustomplot.hqcustomplot.cpp 三個檔案放在同一個資料夾下。

2.3 編譯出動態庫

使用 Qt Creator 開啟 sharedlib-compilation.pro 檔案,選擇合適的編譯器,這個編譯器必須與後面使用動態庫時的編譯器一樣,比如都為 MSVC2015 64bit。(編譯時選擇 Debug 模式或者 Release 模式都可以,不影響最後的使用,因為 .pro 檔案裡面有設定,不管是哪種模式,最後兩種版本都會生成。)

點選左下角這個錘子圖示,編譯動態庫,等待編譯。

編譯完成後,會在構建目錄下生成動態庫,我的構建目錄為(因人而異):

E:\Cworkspace\Qt 5.9\QtDemo\build-sharedlib-compilation-Desktop_Qt_5_9_2_MSVC2015_64bit-Debug

該目錄的 debugrelease 子目錄下分別有對應版本的動態庫,使用時只需要 .lib 以及 .dll 檔案(不同平臺編譯器的生成結果會有差異)。

3. 使用動態庫

使用動態庫時,需把以下三個檔案放在編譯器能找到的地方:上一步生成的 .lib 以及 .dll 檔案(不同平臺編譯器的生成結果會有差異,但都是一個靜態庫檔案和一個動態庫檔案)、qcustomplot.h 檔案。同樣以 MSVC2015 64bit 為例。

3.1 在使用工程檔案 .pro 中新增程式碼

在使用動態庫的 .pro 工程檔案中新增以下程式碼(庫的路徑因人而異,下面假設動態庫放在了 .pro 檔案同級目錄下):

greaterThan(QT_MAJOR_VERSION, 4): QT += printsupport

greaterThan(QT_MAJOR_VERSION, 4): CONFIG += c++11
lessThan(QT_MAJOR_VERSION, 5): QMAKE_CXXFLAGS += -std=c++11
    
# Tell the qcustomplot header that it will be used as library:
DEFINES += QCUSTOMPLOT_USE_LIBRARY

# Link with debug version of qcustomplot if compiling in debug mode, else with release library:
CONFIG(debug, release|debug) {
  win32:QCPLIB = qcustomplotd2
  else: QCPLIB = qcustomplotd
} else {
  win32:QCPLIB = qcustomplot2
  else: QCPLIB = qcustomplot
}
LIBS += -L$$PWD -l$$QCPLIB

若使用 MinGW 編譯器,生成的靜態庫檔案名字前面可能多了 lib 三個字母,包含時需對名字做對應修改:

# Link with debug version of qcustomplot if compiling in debug mode, else with release library:
CONFIG(debug, release|debug) {
  win32:QCPLIB = libqcustomplotd2
  else: QCPLIB = libqcustomplotd
} else {
  win32:QCPLIB = libqcustomplot2
  else: QCPLIB = libqcustomplot
}
LIBS += -L$$PWD -l$$QCPLIB

新增以上程式碼後,就可以按正常方式使用 QCustomPlot 繪相簿了。

3.2 使用注意事項

通過動態庫的方式進行使用時,需注意以下幾點:

  • 編譯動態庫時的編譯器版本必須和使用動態庫時的編譯器版本保持一致。
  • 生成的動態庫檔案、靜態庫檔案、qcustomplot.h 檔案必須放在編譯器能找到的地方,比如 .pro 檔案所在目錄、生成目錄。
  • 不能使用 HEADERS += 的方式在 .pro 檔案中包含 qcustomplot.h,只能通過 #include 的方式在相關檔案中包含該標頭檔案。

3.3 使用範例程式碼

工程檔案(sharedlib-usage.pro)程式碼如下,其中的庫由 MSVC2015 64bit 編譯器生成:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport

TARGET = sharedlib-usage
TEMPLATE = app

greaterThan(QT_MAJOR_VERSION, 4): CONFIG += c++11
lessThan(QT_MAJOR_VERSION, 5): QMAKE_CXXFLAGS += -std=c++11

# Tell the qcustomplot header that it will be used as library:
DEFINES += QCUSTOMPLOT_USE_LIBRARY

# Link with debug version of qcustomplot if compiling in debug mode, else with release library:
CONFIG(debug, release|debug) {
  win32:QCPLIB = qcustomplotd2
  else: QCPLIB = qcustomplotd
} else {
  win32:QCPLIB = qcustomplot2
  else: QCPLIB = qcustomplot
}
LIBS += -L$$PWD -l$$QCPLIB

SOURCES += \
        main.cpp

主函數檔案(main.cpp)程式碼如下:

#include <QApplication>
#include <QMainWindow>
#include "qcustomplot.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QMainWindow window;

    // setup customPlot as central widget of window:
    QCustomPlot customPlot;
    window.setCentralWidget(&customPlot);

    // create plot (from quadratic plot example):
    QVector<double> x(101), y(101);
    for (int i=0; i<101; ++i)
    {
        x[i] = i/50.0 - 1;
        y[i] = x[i]*x[i];
    }
    customPlot.addGraph();
    customPlot.graph(0)->setData(x, y);
    customPlot.xAxis->setLabel("x");
    customPlot.yAxis->setLabel("y");
    customPlot.rescaleAxes();

    window.setGeometry(100, 100, 500, 400);
    window.show();

    return a.exec();
}

工程目錄結構如下: