十二、Qt自定義Widget組件、靜態庫與動態庫

一、自定義Widget組件

1、自定義Widget組件

使用步驟
  • 采用提升法(promotion)
  • 重新定義paintEvent事件

2、實現程序

在這里插入圖片描述

(1)創建項目,基于QWidget

在這里插入圖片描述

(2)添加類,為Widget組件提升類

#include "battery.h"
#include <QPainter>int Battery::powerLevel() const
{return mPowerLevel;
}void Battery::setPowerLevel(int powerLevel)
{mPowerLevel = powerLevel;repaint();
}void Battery::paintEvent(QPaintEvent *event)
{Q_UNUSED(event)QPainter painter(this);QRect rect(0, 0, width(), height());painter.setViewport(rect);painter.setWindow(0, 0, 120, 50); // 設置窗口邏輯坐標painter.setRenderHint(QPainter::Antialiasing);painter.setRenderHint(QPainter::TextAntialiasing);// 繪制電池邊框QPen pen;pen.setWidth(2);pen.setColor(mColorBorder);pen.setStyle(Qt::SolidLine);pen.setCapStyle(Qt::FlatCap);pen.setJoinStyle(Qt::BevelJoin);painter.setPen(pen);QBrush brush;brush.setColor(mColorBack);brush.setStyle(Qt::SolidPattern);painter.setBrush(brush);rect.setRect(1, 1, 109, 48);painter.drawRect(rect);brush.setColor(mColorBorder);painter.setBrush(brush);rect.setRect(110, 15, 10, 20);painter.drawRect(rect);// 畫電量if(mPowerLevel <= mWarning){brush.setColor(mColorWarning);pen.setColor(mColorWarning);}else{brush.setColor(mColorPower);pen.setColor(mColorPower);}painter.setBrush(brush);painter.setPen(pen);if(mPowerLevel > 0){rect.setRect(5, 5, mPowerLevel, 40);painter.drawRect(rect);}// 繪制百分比文字QFontMetrics textSize(this->font());QString powerStr = QString::asprintf("%d%%", mPowerLevel);QRect textRect = textSize.boundingRect(powerStr);pen.setColor(mColorBorder);painter.setPen(pen);painter.drawText(55 - textRect.width() / 2, 23 + textRect.height() / 2, powerStr);}Battery::Battery(QWidget *parent) : QWidget(parent)
{}

(3)設置標題和圖標(圖標需要選擇資源中圖標,直接選擇文件可能無效)

在這里插入圖片描述

(4)實現電池電量修改

#include "widget.h"
#include "ui_widget.h"#include "battery.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);ui->battery->setPowerLevel( ui->horizontalSlider->value() );
}Widget::~Widget()
{delete ui;
}void Widget::on_horizontalSlider_valueChanged(int value)
{int nPower = ui->horizontalSlider->value();ui->battery->setPowerLevel(nPower);ui->label->setText(QString::asprintf("當前電量: %d%%", nPower));
}

在這里插入圖片描述

二、自定義QtDesigner插件

1、實現程序

(1)創建自定義控件工程

在這里插入圖片描述
在這里插入圖片描述
設置分組
在這里插入圖片描述

(2)將生成的dll庫拷貝到Tools\QtCreator\bin\plugins\designer下

(3)創建項目,基于QWidget

在UI編輯界面組件欄可以看到多分組MyWidget下有了Battery組件。(我沒做出來,始終是加載失敗,之后測試處理)
初步分析:似乎因為Qt IDE是由MSVC編譯,所以插件必須為MSVC編譯(本人使用MSVC2015 64bit測試,沒有加載成功,之后測試32bit)

在這里插入圖片描述
在這里插入圖片描述

三、靜態鏈接庫

1、靜態鏈接庫的創建和使用

(1)創建靜態鏈接庫

  • MSVC編譯器生成的庫后綴為“.lib”
  • MinGW編譯器生成的庫后綴為".a"

(2)使用靜態庫

需要使用靜態庫文件和h文件,不需要cpp文件

2、實現程序

在這里插入圖片描述

(1)創建Library項目

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

(2)使用圖表中的一個窗口

在這里插入圖片描述

(3)創建項目調用庫

(4)添加庫

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

(5)實現功能

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialogpen.h"#include <QPainter>void MainWindow::paintEvent(QPaintEvent *event)
{Q_UNUSED(event)QPainter painter(this);QRect rect(0, 0, width(), height());painter.setViewport(rect);painter.setWindow(0, 0, 100, 50); // 邏輯坐標painter.setPen(mPen);painter.drawRect(10, 10, 80, 30);
}MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_actSetPen_triggered()
{bool ok = false;QPen pen = DialogPen::getPen(mPen, ok);if(ok){mPen = pen;repaint();}
}

在這里插入圖片描述

四、共享庫(動態鏈接庫)

1、動態庫聲明

(1)隱式加載

#if defined(DLL_LIBRARY)
#define DLLSHARED_EXPORT Q_DECL_EXPORT
#else
#define DLLSHARED_EXPORT Q_DECL_IMPORT
#endif

(2)顯示加載(直接打開dll庫,直接解析調用函數)

typedef int (*FunDef)(int);FunDef myFun = (FunDef)myLib.resolve("funName"); //解析dll函數
int n = myFun(1); //調用函數

2、實現隱式加載程序

(1)創建動態庫工程

在這里插入圖片描述

(2)導出動態庫

class SHAREDLIBSHARED_EXPORT DialogPen : public QDialog

(3)實現功能

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialogpen.h"#include <QPainter>void MainWindow::paintEvent(QPaintEvent *event)
{Q_UNUSED(event)QPainter painter(this);QRect rect(0, 0, width(), height());painter.setViewport(rect);painter.setWindow(0, 0, 100, 50); // 邏輯坐標painter.setPen(mPen);painter.drawRect(10, 10, 80, 30);
}MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_actSetPen_triggered()
{bool ok = false;QPen pen = DialogPen::getPen(mPen, ok);if(ok){mPen = pen;repaint();}
}

在這里插入圖片描述

3、實現顯式加載程序

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/711235.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711235.shtml
英文地址,請注明出處:http://en.pswp.cn/news/711235.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot 集成 Quartz 實現定時任務

Spring Boot 集成 Quartz 實現定時任務 在Spring Boot應用中&#xff0c;我們經常需要執行一些定時任務&#xff0c;如每天發送報表、定時更新數據庫等。雖然Spring Framework自帶了一個簡單的定時任務功能&#xff08;Scheduled&#xff09;&#xff0c;但在一些復雜場景下&a…

Vue3 在SCSS中使用v-bind

template 先創建一個通用的頁面結構 <template><div class"v-bubble-bg"></div> </template>js 在JS中先對需要用的數據進行定義&#xff1a; 可以是參數&#xff0c;也可以是data <script setup>const props defineProps({bgCol…

cURL 命令中有$的問題

最近學會使用cURL來快速訪問網絡資源&#xff0c;確實很好用&#xff0c;但在使用過程中遇到一個奇怪的問題&#xff0c;多方查詢也沒有找到現成答案&#xff0c;最后經摸索終于解決&#xff0c;特記錄如下。 我們一般訪問網站使用Chrome瀏覽器獲取的cURL命令大概是這個樣子&am…

gpt批量原創文章生成器,不限制內容的生成器

在當今的數字化時代&#xff0c;內容創作是網站持續發展的重要組成部分。然而&#xff0c;對于擁有大量內容需求的網站來說&#xff0c;手動創作文章可能會耗費大量時間和精力。為了解決這一問題&#xff0c;許多GPT&#xff08;生成式預訓練模型&#xff09;文章生成軟件應運而…

【重溫設計模式】外觀模式及其Java示例

設計模式及外觀模式介紹 在編程世界中&#xff0c;設計模式就如同自然界的法則&#xff0c;是一種反復出現在各種情況下的通用解決方案。設計模式可以分為創建型、結構型和行為型三大類&#xff0c;每一類都有其獨特的應用場景和解決問題的方式。今天&#xff0c;我們要重點解…

【HbuilderX】 uniapp實現 android申請權限 和 退出app返回桌面

目錄 android申請權限&#xff1a; 監聽用戶是否開啟權限或關閉權限&#xff1a; 退出app返回桌面&#xff1a; android申請權限&#xff1a; 首先在 manifest.json 內添加你所需要用到權限 添加權限插件 permission.js 一次就好1/權限插件 - Gitee.comhttps://gitee.co…

數據庫分庫分表中間件選擇

目前分庫分表的中間件有三種設計思路&#xff0c;分別是&#xff1a; 采用分散式架構&#xff0c;適用于用Java開發的高性能輕量級OLTP應用程序&#xff0c;以Sharding-JDBC為代表。采用中間層Proxy架構&#xff0c;提供了靜態輸入和所有語言支持&#xff0c;適用于OLAP應用程…

MATLAB環境下基于小波和濾波器組的音頻信號處理

音頻分類研究的重點&#xff0c;一方面在于音頻特征的提取和選擇&#xff0c;通常來說數據集和特征集在分類系統中有著極為重要的作用&#xff0c;離開了對數據集的處理、對特征集中特征的提取和選擇&#xff0c;分類結果必將產生巨大誤差。對于提高音頻分類系統的分類準確度和…

vulnhub-----Hackademic靶機

文章目錄 1.C段掃描2.端口掃描3.服務掃描4.web分析5.sql注入6.目錄掃描7.寫馬php反彈shell木馬 8.反彈shell9.內核提權 1.C段掃描 kali:192.168.9.27 靶機&#xff1a;192.168.9.25 ┌──(root?kali)-[~] └─# arp-scan -l Interface: eth0,…

Docker容器(3)單容器管理

一、單容器 1.1概念簡介 Docker三個重要概念: 倉庫(Repository); 鏡像(Image); 容器(Container). *Docker的三個重要概念是倉庫(Repository)、鏡像(Image)和容器(Container)**。具體如下&#xff1a; **鏡像(Image)**&#xff1a;Docker鏡像是創建容器的基礎&#xff0c;它類似…

『NLP學習筆記』圖解Word2vec(The Illustrated Word2vec)

圖解Word2vec(The Illustrated Word2vec) 文章目錄 一. 詞嵌入(word embedding)1.1. 個性嵌入:你是什么樣的人?1.2. 詞嵌入1.3. 類比1.4. 語言模型1.5. 語言模型訓練1.6. 顧及兩頭(上下文)1.7. Skip-gram模型1.8. 重新審視訓練過程1.9. 負例采樣1.10. 基于負例采樣的Skip…

Maven面試題

以下是一些關于Maven的經典面試題以及它們的答案&#xff1a; 1、什么是Maven&#xff1f; Maven是一個項目管理工具&#xff0c;用于構建、管理、發布Java項目。 2、為什么要使用Maven而不是手動管理項目依賴&#xff1f; Maven提供了依賴管理、統一的構建、打包、文檔生…

Linux DKMS

DKMS&#xff08;Dynamic Kernel Module Support&#xff09;是一個框架&#xff0c;用于構建和安裝內核模塊。它允許第三方內核模塊在系統內核升級時自動重新構建和安裝&#xff0c;從而確保這些模塊與新內核版本兼容。 DKMS的工作原理是將內核模塊的源代碼和安裝腳本存儲在一…

Google索引腳本:快速索引你的網站

公眾號&#xff1a;【可樂前端】&#xff0c;每天3分鐘學習一個優秀的開源項目&#xff0c;分享web面試與實戰知識。 每天3分鐘開源 hi&#xff0c;這里是每天3分鐘開源&#xff0c;很高興又跟大家見面了&#xff0c;今天介紹的開源項目簡介如下&#xff1a; 倉庫名&#xff1…

園區停車管理系統的設計與實現

** &#x1f345;點贊收藏關注 → 私信領取本源代碼、數據庫&#x1f345; 本人在Java畢業設計領域有多年的經驗&#xff0c;陸續會更新更多優質的Java實戰項目希望你能有所收獲&#xff0c;少走一些彎路。&#x1f345;關注我不迷路&#x1f345;** 一 、設計說明 1.1 選題…

【前端素材】推薦優質在線通用果蔬商城電商網頁eStore平臺模板(附源碼)

一、需求分析 1、系統定義 通用果蔬網站是指專門提供各類果蔬產品展示和銷售的在線平臺。它將不同種類的新鮮水果、蔬菜、干果、堅果等聚集在一起&#xff0c;為消費者提供方便、快捷的購物渠道。 2、功能需求 通用果蔬網站是指專門提供各類果蔬產品展示和銷售的在線平臺。…

Nginx常用配置--負載均衡服務

可以將 nginx 作為一個非常高效的 HTTP 負載均衡器&#xff0c;將流量分配到多個應用服務器上&#xff0c;并通過 nginx 提高 Web 應用的性能、可擴展性和可靠性。 nginx 可以通過添加一個 upstream&#xff0c;來實現 nginx 的負載均衡功能。 upstream myserver {server 192…

算法D27|回溯算法4| 93.復原IP地址 78.子集 90.子集II

93.復原IP地址 本期本來是很有難度的&#xff0c;不過 大家做完 分割回文串 之后&#xff0c;本題就容易很多了 題目鏈接/文章講解&#xff1a;代碼隨想錄 視頻講解&#xff1a;回溯算法如何分割字符串并判斷是合法IP&#xff1f;| LeetCode&#xff1a;93.復原IP地址_嗶哩嗶…

面試數據庫篇(mysql)- 08事務

原理 事務是一組操作的集合,它是一個不可分割的工作單位,事務會把所有的操作作為一個整體一起向系統提交或撤銷操作請求,即這些操作要么同時成功,要么同時失敗。 ACID是什么?可以詳細說一下嗎? 原子性(Atomicity):事務是不可分割的最小操作單元,要么全部成功,要么全…

添加用戶為root權限,添加到sudo分組中

在Linux系統中&#xff0c;將用戶添加到sudo組是一種常見的方式&#xff0c;使得該用戶能夠執行sudo命令&#xff0c;從而獲得管理員權限。以下是如何將用戶添加到sudo組的步驟&#xff1a; 打開終端。 使用以下命令將用戶添加到sudo組。請將username替換為你想要添加到sudo組…