Qt自定义控件:关于大佬“飞扬青云“的自定义UI控件的使用教程(MinGw,MSVC)

news2025/3/1 8:01:26

前言

最近在搞自定义控件,无意间发现大佬飞扬青云的开源项目,Qt/C++编写超精美自定义控件

这里先贴出大佬项目地址和博客

码云:wwlzq5/qucsdk (gitee.com)(旧版下载地址Qt4.7到Qt5.14)
github:https://github.com/feiyangqingyun/qucsdk (高版本下载地址Qt5.15到Qt6.5)
csdn:https://me.csdn.net/feiyangqingyun

由于没有在网上看到别人导入大佬的控件并使用(大多只是显示ui界面,没有使用控件图片,即有导入,但是没有使用,也不知道能不能用),我想把它导入到Qt Creater并且能正常编译运行,废话不多说,直接上操作,因为我Qt 是低版本(5.14)的,所以我就按照旧版本的来说了,旧版新版操作一样,这里我将从两种编译方式讲,一篇到位

MinGw

第一步:

首先在帮助中可以看下自己Qt版本

记住自己的这个版本,下面要用到,这里可以看到我的是Qt5.14.1 MSVC2017 32位

第二步:

打开你下载的文件,应该是,解压后应该是这样的

新版是这样的

第三步:

根据自己的Qt版本,也就是上面我说的要用到的,我的是Qt5.14.1 MSVC2017 32位,根据自己的版本去文件夹里面找相应版本的文件夹

旧版去SDK开头那三个文件夹找(SDKDemo是作者的一个教学例子),新版就去shared里面找,这里我解压过了,没必要全解压,就解压和你版本对应的就行

第四步:

打开文件夹,将图中的这两个文件,复制到你的Qt下Tools的designer中,这里我的路径是

E:\Qt\Qt\Tools\QtCreator\bin\plugins\designer

这时就可以打开qt,任意创建一个项目,就会发现,控件已经加载到Qt Creater中了,还可以拖动控件到ui界面中

第五步:

新建一个Qt项目,编译器选择MinGw,记住自己编译器的位数

第六步:

进入ui设计拉去一个控件(最好和我拉取的一样,因为不一样的控件,要引入的头文件不一样)

第七步:

右键项目任意文件,在explorer中展示,然后在项目中创建两个文件夹,bin和include

第八步:

根据自己的编译器位数,就是第五步中的编译器,这里我的是5.14.2 MinGW 64位,去下载的文件中去找和自己版本对应的文件夹,然后解压

旧版去SDK开头那三个文件夹找(SDKDemo是作者的一个教学例子),新版就去shared里面找

第九步:

打开文件夹,然后将这四个文件复制到我们新建的bin文件夹中

复制到bin中

然后在下载的文件夹的include去找gaugecar.h这个头文件,将它复制到我们新建的项目的include文件夹中 

复制到include中

第十步:

打开你新建的项目pro文件添加如下代码

INCLUDEPATH += $$PWD/include
DEPENDPATH += $$PWD/include

CONFIG(debug, debug|release){
LIBS += -L$$PWD/bin/ -lqucd
} else {
LIBS += -L$$PWD/bin/ -lquc
}

第十一步:

编译并运行项目,可以看到能正常编译运行,而且控件也有

第十二步:

这一步我们测试控件能否正常使用先在ui界面中添加两个按钮,更改控件内容为开始和停止,再更改控件名称,分别为startBtn和stopBtn

然后在mainwindow.h中添加如下代码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimer>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void timeOut();

    void on_startBtn_clicked();

    void on_stopBtn_clicked();

private:
    Ui::MainWindow *ui;
    QTimer* m_timer;
};
#endif // MAINWINDOW_H

在mainwindow.cpp中添加如下代码 

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTime>
#include <QColor>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //创建一个定时器
    m_timer = new QTimer(this);
    //设置时间间隔1ms
    m_timer->setInterval(100);
    //
    connect(m_timer, SIGNAL(timeout()), this, SLOT(timeOut()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::timeOut()
{
    static int value = 0;
    if (value < 100) {
        value++;
        ui->gaugeCar->setValue(value);
    } else if (value >= 100 && value < 200) {
        value++;
        int temp = 200 - value;
        ui->gaugeCar->setValue(temp);
    } else if (value == 200) {
        value = 0;
    }
}


void MainWindow::on_startBtn_clicked()
{
    //开始计时
    m_timer->start();
}

void MainWindow::on_stopBtn_clicked()
{
    //停止
    m_timer->stop();
}

第十三步:

编译,运行项目,可以看到,仪表盘的数字和指针在变化

运行效果视频

测试完成

MSVC

第一步:

首先在帮助中可以看下自己Qt版本

记住自己的这个版本,下面要用到,这里可以看到我的是Qt5.14.1 MSVC2017 32位

第二步:

打开你下载的文件,应该是,解压后应该是这样的

新版是这样的

第三步:

根据自己的Qt版本,也就是上面我说的要用到的,我的是Qt5.14.1 MSVC2017 32位,根据自己的版本去文件夹里面找相应版本的文件夹

旧版去SDK开头那三个文件夹找(SDKDemo是作者的一个教学例子),新版就去shared里面找,这里我解压过了,没必要全解压,就解压和你版本对应的就行

第四步:

打开文件夹,将图中的这两个文件,复制到你的Qt下Tools的designer中,这里我的路径是

E:\Qt\Qt\Tools\QtCreator\bin\plugins\designer

这时就可以打开qt,任意创建一个项目,就会发现,控件已经加载到Qt Creater中了,还可以拖动控件到ui界面中

第五步:

新建一个Qt项目,编译器选择MSVC,记住自己编译器的位数

第六步:

进入ui设计拉去一个控件(最好和我拉取的一样,因为不一样的控件,要引入的头文件不一样)

第七步:

右键项目任意文件,在explorer中展示,然后在项目中创建两个文件夹,bin和include

第八步:

根据自己的编译器位数,就是第五步中的编译器,这里我的是5.14.2 MSVC2017 64位,去下载的文件中去找和自己版本对应的文件夹,然后解压

旧版去SDK开头那三个文件夹找(SDKDemo是作者的一个教学例子),新版就去shared里面找

第九步:

打开文件夹,然后将这四个文件复制到我们新建的bin文件夹中

复制到bin中

然后在下载的文件夹的include去找gaugecar.h这个头文件,将它复制到我们新建的项目的include文件夹中  

复制到include中

第十步:

打开你新建的项目pro文件添加如下代码

INCLUDEPATH += $$PWD/include
DEPENDPATH += $$PWD/include

CONFIG(debug, debug|release){
LIBS += -L$$PWD/bin/ -lqucd
} else {
LIBS += -L$$PWD/bin/ -lquc
}

第十一步:

编译并运行项目,可以看到能正常编译运行,而且控件也有

第十二步:

这一步我们测试控件能否正常使用先在ui界面中添加两个按钮,更改控件内容为开始和停止,再更改控件名称,分别为startBtn和stopBtn

然后在mainwindow.h中添加如下代码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimer>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void timeOut();

    void on_startBtn_clicked();

    void on_stopBtn_clicked();

private:
    Ui::MainWindow *ui;
    QTimer* m_timer;
};
#endif // MAINWINDOW_H

在mainwindow.cpp中添加如下代码 

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTime>
#include <QColor>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //创建一个定时器
    m_timer = new QTimer(this);
    //设置时间间隔1ms
    m_timer->setInterval(100);
    //
    connect(m_timer, SIGNAL(timeout()), this, SLOT(timeOut()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::timeOut()
{
    static int value = 0;
    if (value < 100) {
        value++;
        ui->gaugeCar->setValue(value);
    } else if (value >= 100 && value < 200) {
        value++;
        int temp = 200 - value;
        ui->gaugeCar->setValue(temp);
    } else if (value == 200) {
        value = 0;
    }
}


void MainWindow::on_startBtn_clicked()
{
    //开始计时
    m_timer->start();
}

void MainWindow::on_stopBtn_clicked()
{
    //停止
    m_timer->stop();
}

第十三步:

编译,运行项目,可以看到,仪表盘的数字和指针在变化

运行效果视频

测试完成

小结

首先还是要感谢飞扬青云大佬的开源,大佬博客还有很多其它开源项目,非常给力。

在说一说,当我们添加多个控件时,需要导入多个相应的头文件,当然只需要放到你项目include文件夹中就行,也可以将所有的头文件放入到一个文件夹中然后每次新建项目都引入这文件夹,这样就不用每次一个一个的导入头文件,缺点就是很多资源都用不到,造成项目的庞大冗余。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2040344.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

攻克面试:高频面试题与常见算法深度剖析

干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版和持续更新见高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言…

第1章 大模型的概念、发展历程和应用领域

大模型&#xff1a;塑造未来的智能力量 目录 引言&#xff1a;大模型的定义与影响大模型的发展历程 早期探索&#xff1a;深度学习的起步中期发展&#xff1a;算法的革新与计算能力的提升当代突破&#xff1a;大模型的崛起 大模型的影响与未来展望 引言&#xff1a;大模型的定…

【设计模式】六大原则之依赖倒置原则(Dependency Inversion Principle,‌DIP)

设计模式是对相关问题提出的解决方案。 一般而言&#xff0c;一个模式有四个基本要素&#xff1a; 模式名称 &#xff08;pattern name&#xff09; 一个助记名&#xff0c;它用一两个词语来描述模式问题、解决方案和效果。问题&#xff08;problem&#xff09;描述了应该在何…

Unity中对Spine动画播放、暂停、事件处理管理类

Unity中对Spine动画播放、暂停、事件处理管理类 介绍Spine的事件处理动画师制作沟通Unity前端使用事件 Unity中动画播放Unity中动画暂定和继续Unity中停止动画Unity中动画转向Unity中获取骨骼和设置插槽附件完整管理类分享总结 介绍 最近在做设计spine动画的抖音小程序&#x…

RecyclerView的缓存机制(面试常客)

在构建滚动列表时&#xff0c;我们常首选RecyclerView&#xff0c;出于它优秀的缓存复用机制。 核心机制 RecyclerView的缓存机制又称回收复用机制&#xff0c;RecyclerView构建列表视图分为以下三步&#xff1a; 第一步的创建ViewHolder是RecyclerView构建视图时最耗时的操作…

鸿蒙(API 12 Beta3版)【使用通话设备切换组件】使用投播组件

基本概念 系统不再提供音频输出设备切换的API&#xff0c;如果需要应用内切换音频输出设备&#xff0c;请实现AVCastPicker组件&#xff0c;相关参数可参考[ohos.multimedia.avCastPicker]和 [ohos.multimedia.avCastPickerParam]。 本文将主要介绍AVCastPicker组件接入&…

【论文笔记】:PVswin-YOLOv8s:基于无人机的行人和车辆检测,使用改进的YOLOv8在智能城市中进行交通管理

摘要 在智慧城市中&#xff0c;有效的交通拥堵管理取决于熟练的行人和车辆检测。无人机 &#xff08;UAV&#xff09; 提供了一种具有移动性、成本效益和宽视野的解决方案&#xff0c;然而&#xff0c;优化识别模型对于克服小型和遮挡物体带来的挑战至关重要。为了解决这些问题…

推出 SAM 2:适用于视频和图像的下一代 Meta Segment Anything 模型

继图像元分割模型(SAM) 取得成功之后&#xff0c;我们发布了SAM 2&#xff0c;这是一个用于在图像和视频中实时提示对象分割的统一模型&#xff0c;可实现最先进的性能。 为了秉承我们的开放科学方针&#xff0c;我们通过宽松的 Apache 2.0 许可证共享代码和模型权重。 我们还…

嵌入式linux系统镜像制作day2

点击上方"蓝字"关注我们 01、前言 嵌入式linux系统镜像制作day1这一节先了解,后面实操 02、Yocto项目快速启动 Yocto项目通过OpenEmbedded构建系统为各种平台(包括x86-64和仿真平台)提供了一个针对ARM、MIPS、PowerPC和x86架构的开源开发环境。您可以使用Yocto项…

WebDeveloper:1靶机渗透测试

一、靶机下载地址 https://www.vulnhub.com/entry/web-developer-1,288/ 二、信息收集 1、主机发现 # 使用命令 nmap 192.168.145.0/24 -sn | grep -B 2 "00:0C:29:54:22:E9" 2、端口扫描 # 使用命令 nmap 192.168.145.216 -p- -sV 3、指纹识别 # 使用命令 wha…

【SpringCloud】什么是MQ

RabbitMQ 1.什么是MQ 1.1 同步和异步通信 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就例如打电话一样&#xff0c;需要实时响应异步通讯&#xff1a;就例如发邮件一样&#xff0c;不需要马上回复 1.1.1同步通讯 Feign的远程调用就属于同步通讯…

【数据分析】描述性统计分析 - 直方图

一、什么是直方图 由一批长方形构成&#xff0c;通过长方形的面积或高度来代表对应组在数据中所占的比例。用长方形的面积代表对应组的频数与组距的比时&#xff0c;则称为频率分布直方图;当用长方形的高代表对应组的频数时&#xff0c;则称为频数分布直方图。但严格统计意义上…

WT32-ETH01开发板模块,启明云端物联网方案,乐鑫ESP32多样化开发应用

在物联网(IoT)的浪潮中&#xff0c;无线Wi-Fi模块作为连接传统硬件与现代智能网络的桥梁&#xff0c;正逐渐成为智能家居和设备通信不可或缺的一部分。Wi-Fi模块也被称为串口Wi-Fi模块&#xff0c;是一种嵌入式模块&#xff0c;它能够将串口或TTL电平信号转换为符合Wi-Fi无线网…

普元EOS-多数据源时业务数据库初始化

1 问题 EOS开发应用的时候&#xff0c;可以采用多数据源。 项目启动的是时候报错如下&#xff1a; 2024-08-14 16:03:56.105 ERROR [EOS-DEMO-SYS,EOSLOWCODE,default,cuipengyu:EOSLOWCODE:28015,,,,] 28960 --- [Timer-0] c.p.g.a.a.m.RdcloudStatisticsThread : User…

66_1JSON【浏览器中处理JSON、Java中处理JSON(FastJSON、Jackson)】、Java中的bean

JSON 概念 JSON&#xff1a;JavaScript Object Notation是一种表示对象的方式 基于JavaScript语言的轻量级的数据交换格式;&#xff08;即:用来传输数据的一种格式&#xff09; 现在传输数据的方式更多是采用json的格式&#xff0c;渐渐代替了XML JSON的数据表示 JSON采用名值…

封装一个细粒度的限流器

文章目录 原因限流对象限流后的做法怎么确定限流阈值观测业务性能数据压测借鉴链路上的其他服务手动计算 四种静态限流算法令牌桶漏桶固定窗口与滑动窗口 手写限流算法令牌桶漏桶固定窗口滑动窗口 分布式限流的具体实现 原因 尽管云原生网关里有统一入口的限流&#xff08;根据…

股指期货套期保值中的展期管理有哪些?

在复杂的金融市场环境中&#xff0c;展期作为一种重要的风险管理工具&#xff0c;被广泛应用于期货交易中&#xff0c;特别是当投资者需要对长期资产进行套期保值时。展期的核心思想在于&#xff0c;通过连续替换高流动性的近月期货合约来替代流动性较差的远月合约&#xff0c;…

untiy有渲染线程和逻辑线程嘛

之前我也这么认为&#xff0c;其实unity引擎是单线程的&#xff0c;当然后续的jobs不在考虑范围内 如果你在一个awake 或者 start方法中 延时&#xff0c;是会卡住主线程的 比如 其实游戏引擎有一个基础简单理解&#xff0c;那就是不断的进行一个循环&#xff0c;在这个周期循…

网络分段如何增强 OT 网络的可见性

防火墙在保护运营技术(OT) 网络和系统方面发挥什么作用&#xff1f; 很多人会说&#xff0c;防火墙是一种防御机制&#xff0c;用于保护该环境免受 IT 和外界的影响。对于负责该关键系统正常运行的操作员来说&#xff0c;防火墙是阻止他人进入的外围保护。它也是需要从 OT 系统…

Unity Render Streaming项目实践经验

UnityRenderStreaming项目 项目github地址见上,我使用项目的3.1.0-exp.7版本、Unity 2023.1.0版本、windows11运行。 1下载项目包 2在Unity Hub中打开RenderStreaming~文件夹 3在package manager中导入com.unity.renderstreaming package 因为已经下载过了就选择install pa…