版本说明:

1、优化柱状图显示,支持颜色变化
This commit is contained in:
lz
2025-03-11 09:13:16 +08:00
parent 18a5c89606
commit b67dba425a
2 changed files with 159 additions and 11 deletions

View File

@@ -17,6 +17,9 @@
#include <QPolarChart>
#include <QScatterSeries>
#include <QSplineSeries>
#include <QStackedBarSeries>
#include <QToolTip>
qreal get_rand(qreal maxValue) { return rand() * 1.0 / RAND_MAX * maxValue; }
@@ -44,8 +47,8 @@ MainWindow::MainWindow(QWidget *parent)
//创建udp socket
m_udpSocket = std::make_shared<QUdpSocket>();
m_udpServerSocket = std::make_shared<QUdpSocket>();
m_udpServerSocket->bind(8000);
connect(&*m_udpServerSocket, &QUdpSocket::readyRead, this, &MainWindow::readPendingDatagrams);
//测试
test();
}
@@ -93,8 +96,8 @@ void MainWindow::readPendingDatagrams(){
m_udpServerSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);
//TODO:处理数据包
//qDebug() << "Received datagram from" << sender.toString() << ":" << senderPort;
//qDebug() << "Data:" << datagram;
qDebug() << "Received datagram from" << sender.toString() << ":" << senderPort;
qDebug() << "Data:" << datagram;
//有来电
ui->cmbCallNumber->setEnabled(false);
@@ -122,6 +125,8 @@ void MainWindow::readPendingDatagrams(){
ui->btnCallReject->show();
ui->lblCallStatus->setText("拨号中...");
ui->lblCallDuration->hide();
test1();
}
}
@@ -187,6 +192,69 @@ void MainWindow::test() {
// ui->lblCallDuration->show();
// StartupTalkingTimer();
}
void MainWindow::test1(){
// 随机生成信号能量数据
setSignalStrengthValues(
QStringList{"1号星", "2号星", "3号星", "4号星", "5号星", "6号星"},
QList{get_rand(20.0), get_rand(45.0), get_rand(50.0), get_rand(45.0),
get_rand(50.0), get_rand(40.0)});
// 随机生成方向图数据
QList<QPointF> values;
for (int i = 0; i < 6; i += 1) {
values.append(QPointF(get_rand(360.0), get_rand(360.0)));
}
setAzimuthValues(values);
Record r3;
r3.beginTime = QDateTime::currentDateTime();
r3.channel = Channel::S;
r3.type = CommType::ShortMessage;
r3.direction = CommDirection::Receive;
r3.number = "10003";// + QString::number((get_rand(8)));;
r3.content = "fdghfgdhfghdfghdfghdfghf";// + QString::number((get_rand(15)));
r3.isUnread = true;
r3.callDuration = 0;
m_msgList.push_back(r3);
UpdateMessageList();
m_recordQueryWidget->InsertRecord(m_msgList.back());
m_logger->info("111");
}
// 槽函数实现
void MainWindow::handleHovered(bool status, int index, QBarSet* barset)
{
if(status && barset && index >=0) {
// 获取实际数值(考虑堆叠结构)
const qreal value = barset->at(index);
// 显示定制化提示框
QToolTip::showText(QCursor::pos(),
QString("数值: %1\n阈值: %2")
.arg(value, 0, 'f', 1) // 保留1位小数
.arg(value < 36 ? "" : ""),
nullptr,
QRect(),
2000); // 显示持续2秒
// 添加高亮效果
//barset->setBorderWidth(2);
//barset->setColor(barset->color().lighter(110)); // 亮度提高10%
} else {
// 恢复原始样式
//if(barset) {
// 获取实际数值(考虑堆叠结构)
// const qreal value = barset->at(index);
//barset->setBorderWidth(1);
//barset->setColor(value < 36 ? QColor("#C0C0C0") : QColor("#0000FF"));
//}
}
}
//--------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------
void MainWindow::createBeiDouSignalStrengthChart() {
@@ -201,26 +269,101 @@ void MainWindow::createBeiDouSignalStrengthChart() {
m_signalStrengthChart->addAxis(m_signalStrengthChartXAxis, Qt::AlignBottom);
m_signalStrengthChartYAxis = new QValueAxis;
m_signalStrengthChartYAxis->setRange(0, 10);
m_signalStrengthChartYAxis->setRange(0, 50);
m_signalStrengthChart->addAxis(m_signalStrengthChartYAxis, Qt::AlignLeft);
// series->attachAxis(axisY);
QChartView *chartView = new QChartView(m_signalStrengthChart, this);
chartView->setRenderHint(QPainter::Antialiasing);
ui->vboxChannelBeidouSignalStrength->addWidget(chartView);
ui->vboxChannelBeidouSignalStrength->addWidget(chartView);
m_stackedSeries = new QStackedBarSeries;
connect(m_stackedSeries, &QStackedBarSeries::hovered, this, &MainWindow::handleHovered);
}
void MainWindow::setSignalStrengthValues(const QStringList &categories,
const QList<qreal> &yValues) {
// 清空旧数据
m_signalStrengthChart->removeAllSeries();
m_signalStrengthChartXAxis->clear();
// 创建数据集
QBarSet *set0 = new QBarSet("Power");
QBarSet *set1 = new QBarSet("Power2");
//set0->append(yValues);
//set1->append(yValues);
foreach (qreal val, yValues) {
if(val >= 36.0)
{
*set0 << 0;
*set1 << val;
}
else
{
*set0 << val;
*set1 << 0;
}
}
//auto set0 = new QBarSet("Power");
//set0->append(yValues);
// 动态设置柱形颜色
set0->setBrush(QBrush(QColor("#C0C0C0")));
set1->setBrush(QBrush(QColor("#0000FF")));
//for(int i = 0; i < set0->count(); ++i) {
// const qreal value = set0->at(i);
// set0->setBrush(QBrush(value < 36.0 ? QColor("#C0C0C0") : QColor("#0000FF")));
// set0->setPen(QPen(value < 36.0 ? QColor("#606060") : QColor("#0d47a1"), 1));
//}
// 创建柱状序列
//QBarSeries *series = new QBarSeries();
//series->append(set0);
//m_signalStrengthChart->addSeries(series);
// 添加对象追踪防止内存泄漏
//set0->setParent(series); // 建立父子关系
// 创建 QStackedBarSeries 对象, 保留并重用 QStackedBarSeries 对象而非每次新建
//if(m_stackedSeries == nullptr) {
// m_stackedSeries = new QStackedBarSeries();
//}
//->clear();
QStackedBarSeries *series2 = new QStackedBarSeries();
//m_stackedSeries->setBarWidth(0.8); // 设置柱子相对宽度
//m_stackedSeries->setUseOpenGL(true); // 启用GPU加速
series2->append(set0);
series2->append(set1);
// 添加对象追踪防止内存泄漏
set0->setParent(series2); // 建立父子关系
set1->setParent(series2); // 建立父子关系
m_signalStrengthChart->addSeries(series2);
//保留并重用QBarSeries对象而非每次新建
//if(m_series == nullptr) {
// m_series = new QBarSeries();
// m_chart->addSeries(m_series);
//}
//m_series->clear();
// 绑定坐标轴
//series2->attachAxis(m_signalStrengthChartXAxis);
series2->attachAxis(m_signalStrengthChartYAxis);
// 设置X轴标签
m_signalStrengthChartXAxis->append(categories);
auto set0 = new QBarSet("Power");
set0->append(yValues);
QBarSeries *series = new QBarSeries;
series->append(set0);
m_signalStrengthChart->removeAllSeries();
m_signalStrengthChart->addSeries(series);
// 动态调整Y轴范围
//qreal maxValue = *std::max_element(yValues.begin(), yValues.end());
//m_signalStrengthChartYAxis->setRange(0, maxValue * 1.2); // 留20%余量
// 优化显示效果
series2->setLabelsVisible(false); // 隐藏数值标签
m_signalStrengthChart->legend()->hide(); // 隐藏图例
// 更新卫星数量显示
ui->lblSatelliteCount->setText(QString::asprintf("%d", categories.count()));
}
void MainWindow::createAzimuthMapChart() {

View File

@@ -6,6 +6,8 @@
#include <memory>
#include <vector>
#include <QTimer>
#include <QBarSet>
#include <QStackedBarSeries>
#include "RecordQuery.h"
#include "LoggerWidget.h"
@@ -39,6 +41,7 @@ class MainWindow : public QMainWindow
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void test1();
private slots:
void on_rdbChannelUHF_clicked();
@@ -59,6 +62,7 @@ private slots:
void readPendingDatagrams();
void on_tblMessageList_currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous);
void handleHovered(bool status, int index, QBarSet *barset);
protected:
void keyPressEvent(QKeyEvent* event) override;
private:
@@ -99,5 +103,6 @@ private:
QPolarChart* m_azimuthChart;
QBarCategoryAxis* m_signalStrengthChartXAxis;
QValueAxis* m_signalStrengthChartYAxis;
QStackedBarSeries *m_stackedSeries;
};
#endif // MAINWINDOW_H