动态库示例

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(QtCompLib LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 查找 Qt5
find_package(Qt5 5 REQUIRED COMPONENTS Core Widgets)

# 头文件列表
set(HEADERS
    basebutton.h
    qtcomplib.h

)

# 源文件列表
set(SOURCES
    basebutton.cpp
    qtcomplib.cpp
)

# 目标安装目录
set(INSTALL_INCLUDE_DIR "D:/CODE/Library/include")
set(INSTALL_BIN_DIR "D:/CODE/Library/bin")
set(INSTALL_LIB_DIR "D:/CODE/Library/lib")

# 创建目标目录
file(MAKE_DIRECTORY ${INSTALL_INCLUDE_DIR})
file(MAKE_DIRECTORY ${INSTALL_BIN_DIR})
file(MAKE_DIRECTORY ${INSTALL_LIB_DIR})

# 定义动态库
add_library(QtCompLib SHARED ${SOURCES} ${HEADERS})

# 确保 moc 运行
set_target_properties(QtCompLib PROPERTIES AUTOMOC ON)

# 定义宏,用于导出类
target_compile_definitions(QtCompLib PRIVATE A_LIBRARY)

# 设置输出目录
set_target_properties(QtCompLib PROPERTIES
    LIBRARY_OUTPUT_DIRECTORY ${INSTALL_BIN_DIR}
    RUNTIME_OUTPUT_DIRECTORY ${INSTALL_BIN_DIR}
    ARCHIVE_OUTPUT_DIRECTORY ${INSTALL_LIB_DIR}
)

# 链接 Qt 库
target_link_libraries(QtCompLib PRIVATE Qt5::Core Qt5::Widgets)

# 复制头文件
foreach(HEADER ${HEADERS})
    add_custom_command(TARGET QtCompLib POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
            "${CMAKE_CURRENT_SOURCE_DIR}/${HEADER}"
            "${INSTALL_INCLUDE_DIR}/${HEADER}"
        COMMENT "Copying ${HEADER} to ${INSTALL_INCLUDE_DIR}"
    )
endforeach()

# 安装
install(FILES ${HEADERS}
    DESTINATION ${INSTALL_INCLUDE_DIR}
    PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
)
install(TARGETS QtCompLib
    RUNTIME DESTINATION ${INSTALL_BIN_DIR}
    LIBRARY DESTINATION ${INSTALL_BIN_DIR}
    ARCHIVE DESTINATION ${INSTALL_LIB_DIR}
)

qtcomplib.h

#ifndef QTCOMPLIB_H
#define QTCOMPLIB_H

#include <QtCore/qglobal.h>

#ifdef A_LIBRARY
#define A_SHARED_EXPORT Q_DECL_EXPORT
#else
#define A_SHARED_EXPORT Q_DECL_IMPORT
#endif

class A_SHARED_EXPORT QtCompLib
{
public:
    QtCompLib();
};

#endif // QTCOMPLIB_H

qtcomplib.cpp

#include "qtcomplib.h"

QtCompLib::QtCompLib() {}

qtcomplib.h

#ifndef BASEBUTTON_H
#define BASEBUTTON_H


#include <QPushButton>

//按钮默认配置
namespace BtnDef{
//按钮默认宽度和高度
constexpr int Width = 100;
constexpr int Height = 40;
//默认字体大小
constexpr int PointSize = 12;
//按钮默认背景色,字体颜色,border-radius
const QString StyleOccupy  =
    QStringLiteral("QPushButton{ %1 } QPushButton:pressed{ %2 } QPushButton:disabled{ %3 }");
const QString Style =
    QStringLiteral("background-color: rgb(98, 162, 204); color: rgb(255, 255, 255); border-radius:3px;");
const QString PressStyle =
    QStringLiteral("background-color: rgb(255, 255, 255); border: 2px solid rgb(149, 175, 192); color: rgb(149, 175, 192);");
const QString DisaStyle =
    QStringLiteral("background-color: rgb(220, 220, 220); color: rgb(168, 168, 168);");
}


namespace Global{
//默认字体
const QString DefFamily = QStringLiteral("Microsoft YaHei");
}

#ifdef A_LIBRARY
#define A_SHARED_EXPORT Q_DECL_EXPORT
#else
#define A_SHARED_EXPORT Q_DECL_IMPORT
#endif

class A_SHARED_EXPORT BaseButton : public QPushButton
{
    Q_OBJECT
public:
     explicit BaseButton(QWidget *parent = nullptr);
     ~BaseButton() override;


 private:
     QString buttonstyleSheet;
     QString pressedstyleSheet;
     QString disabledstyleSheet;

 private:
     void initStyleSheet();

 public:
     //设置styleSheet
     void setButtonStyleSheet(const QString &button, const QString &pressed, const QString &disabled);

     //设置字体大小
     void setFontPointSize(int size);

     //设置字体宽度
     void setFontWidth(QFont::Weight weight);


signals:
};

#endif // BASEBUTTON_H

basebutton.cpp

#include "basebutton.h"

BaseButton::BaseButton(QWidget *parent) : QPushButton(parent)
{
    setMinimumSize(BtnDef::Width, BtnDef::Height);
    setText(tr("btn"));
    buttonstyleSheet.append(BtnDef::Style);
    pressedstyleSheet.append(BtnDef::PressStyle);
    disabledstyleSheet.append(BtnDef::DisaStyle);
    initStyleSheet();
    QFont btnFont(Global::DefFamily, BtnDef::PointSize, QFont::Light);  // 链式初始化
    setFont(btnFont);
}


BaseButton::~BaseButton() {

}

/**
 * 初始化样式
 */
void BaseButton::initStyleSheet() {
    QString styleSheet = QString(BtnDef::StyleOccupy)
    .arg(buttonstyleSheet)
        .arg(pressedstyleSheet)
        .arg(disabledstyleSheet);
    setStyleSheet(styleSheet);
}



/**
 * 设置按钮样式
 * @param button 基础样式
 * @param pressed 点击样式
 * @param disabled 禁用样式
 */
void BaseButton::setButtonStyleSheet(const QString &button, const QString &pressed, const QString &disabled) {
    if (!button.isEmpty()) {
        buttonstyleSheet.append(button);
    }
    if (!pressed.isEmpty()) {
        pressedstyleSheet.append(pressed);
    }
    if (!disabled.isEmpty()) {
        disabledstyleSheet.append(disabled);
    }
    initStyleSheet();
}

/**
 * 设置字体大小
 * @param size
 */
void BaseButton::setFontPointSize(int size) {
    QFont font = this->font();
    font.setPointSize(size);
    setFont(font);
}

/**
 * 设置字体宽度
 * @param weight
 */
void BaseButton::setFontWidth(QFont::Weight weight) {
    QFont font = this->font();
    font.setWeight(weight);
    setFont(font);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丢了尾巴的猴子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值