前言
有AI辅助,没必要手搓自定义控件(1年前用QGraphics+QPainter手搓过1个),可以先找找开源可用的自定义控件,不满足的再让AI辅助进行微创新。本文讲的是feiyangqingyun提供的quc控件。
效果图

以上刻度控件是每秒更新一次,曲线是每秒更新100次。
quc安装方法
QT引用自定义控件
直接点击mainwindow.ui文件是看不到quc控件的,关键步骤是右键点击mainwindow.ui,右键菜单选择【Qt Designer】,在UI设计器中才能找到"Quc Widget"。


注意:以上是前端调用自定义控件的方式,需要编译动态库等操作,相对要麻烦一些。如果有自定义控件的源码.h和.cpp文件,直接加入到现有qt项目中,以后台方式直接调用即可,以下是我分享过一个手搓的自定义控件类
quc测试案例
与效果图配套的测试代码,按要求把3个控件拉入到窗口中即可完成UI设计

增加两个定时器,一个是获取0~100以内的随机数,一个是获取正弦sin值
//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 RandonTimeout();
void WareonTimeout();
private:
Ui::MainWindow *ui;
QTimer *m_rand_timer;
QTimer *m_ware_timer;
double m_phase = 0.0;
};
#endif // MAINWINDOW_H
//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QRandomGenerator>
#include <QDebug>
#include <QtCore/qmath.h>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->gaugeCar->setAnimation(true); // 开启动画,过渡更平滑
ui->gaugeCar->setAnimationStep(2); // 每帧走 2,约半秒到位
ui->gaugeCar->setValue(0); // 初始值
ui->rulerTemp->setValue(0);
// 创建定时器,1000ms = 1秒
m_rand_timer = new QTimer(this);
connect(m_rand_timer, &QTimer::timeout, this, &MainWindow::RandonTimeout);
m_rand_timer->start(1000);
ui->waveChart->setTitle("实时波形");
ui->waveChart->setMinValue(0);
ui->waveChart->setMaxValue(100); // 注意:数据不能为负
ui->waveChart->setXStep(1);
ui->waveChart->setYStep(10);
ui->waveChart->setSpace(10);
ui->waveChart->setSmooth(true); // 平滑曲线,出圆弧效果
ui->waveChart->setShowHLine(true);
ui->waveChart->setBgColorStart(QColor(30, 30, 30));
ui->waveChart->setBgColorEnd(QColor(60, 60, 60));
ui->waveChart->setTextColor(Qt::white);
ui->waveChart->setPointColor(Qt::cyan);
// 创建定时器,1000ms = 1秒
m_ware_timer = new QTimer(this);
connect(m_ware_timer, &QTimer::timeout, this, &MainWindow::WareonTimeout);
m_ware_timer->start(10);
}
MainWindow::~MainWindow()
{
delete ui;
delete m_rand_timer;
delete m_ware_timer;
}
void MainWindow::RandonTimeout()
{
// Qt 5.10+ 推荐写法:生成 [0, 100] 的随机整数
int val = QRandomGenerator::global()->bounded(0, 101);
ui->gaugeCar->setValue(val);
ui->rulerTemp->setValue(val);
}
void MainWindow::WareonTimeout()
{
double value = 50 + 40 * qSin(m_phase); // 你的实际采集值
m_phase += 0.1;
ui->waveChart->addData(value);
}
代码很简洁,直接调用接口,这些接口可以直接跳转到头文件去看。
