源代码如下/**
@file StarWindow.h 任务实施管理的外场抗干扰自动化测试界面中的查看接收机收星状态窗口
@author Liao Hui
@date 2025/05/21
@version v0.1 Copyright (C) 2025 - All Rights Reserved
@warning
***************************************************************/
#include "StarWindow.h"
#include "ui_StarWindow.h"
StarWindow::StarWindow(QWidget *parent)
: QWidget(parent)
, ui(new Ui::StarWindow)
{
ui->setupUi(this);
// 设置子窗口始终在主窗口之上
setWindowFlags(Qt::Window | Qt::WindowStaysOnTopHint|Qt::FramelessWindowHint);
// 可选:设置背景透明
// setAttribute(Qt::WA_TranslucentBackground);
// 移除透明背景属性,改为白色背景
// setAttribute(Qt::WA_TranslucentBackground, false); // 关闭透明
// 设置白色背景
setStyleSheet("background-color: white;");
setWindowFlags(Qt::Window);
setWindowFlags(
windowFlags() | // 保留原有标志
Qt::Window | // 保证有标题栏按钮
Qt::WindowStaysOnTopHint // 添加置顶标志
);
// 设置图标大小
ui->tabWidget->tabBar()->setIconSize(QSize(16, 16));
// 将第1个标签页(索引0)的标题改为"参考接收"
ui->tabWidget->setTabText(0, "参考接收");
// 将第2个标签页(索引1)的标题改为"测试接收"
ui->tabWidget->setTabText(1, "参考接收日志");
// 将第2个标签页(索引1)的标题改为"测试接收"
ui->tabWidget->setTabText(2, "测试接收");
// 将第2个标签页(索引1)的标题改为"测试接收"
ui->tabWidget->setTabText(3, "测试接收日志");
// 去除所有标签页的边框
ui->tabWidget->setStyleSheet("QTabWidget::pane { border: 0; }");
// Tab1
/*Tab1柱状图*/
ui->receDataShow1->setSystemName("System 1");/*柱状图控件声明*/
ui->receDataShow1->setSystemColor(Qt::green);/*柱状图控件颜色*/
ui->receDataShow2->setSystemName("System 2");
ui->receDataShow2->setSystemColor(Qt::blue);
ui->receDataShow3->setSystemName("System 3");
ui->receDataShow3->setSystemColor(Qt::red);
ui->receDataShow4->setSystemName("System 4");
ui->receDataShow4->setSystemColor(Qt::yellow);
/*Tab1天顶图*/
InitTableWidget(ui->tableWidget);/*Tab1天顶图初始化*/
m_scene = new QGraphicsScene(this);/*初始化场景*/
m_scene->setSceneRect(-width()/2, -height()/2, width(), height());/*将原点移动到控件正中心*/
m_scene->setBackgroundBrush(QColor(0, 0, 0));/*设置场景背景为黑色*/
ui->graphicsView->setScene(m_scene);/*将场景与控件绑定*/
drawSkyView(ui->graphicsView->width(),ui->graphicsView->height(), m_scene);/*调用绘制天顶图的函数*/
/*Tab1按键*/
// connect(ui->pushButton, &QPushButton::clicked, this, &StarWindow::on_pushButton_clicked);
connect(ui->pushButton, &QPushButton::clicked, this, [this]() {
on_pushButton_clicked(ui->graphicsView); // 在 lambda 中调用函数
});
ui->plainTextEdit->setReadOnly(true);
TempTest(ui->plainTextEdit);
// Tab2
/*Tab2柱状图*/
ui->receDataShow1_2->setSystemName("System 1");/*柱状图控件声明*/
ui->receDataShow1_2->setSystemColor(Qt::green);/*柱状图控件颜色*/
ui->receDataShow2_2->setSystemName("System 2");
ui->receDataShow2_2->setSystemColor(Qt::blue);
ui->receDataShow3_2->setSystemName("System 3");
ui->receDataShow3_2->setSystemColor(Qt::red);
ui->receDataShow4_2->setSystemName("System 4");
ui->receDataShow4_2->setSystemColor(Qt::yellow);
/*Tab2天顶图*/
InitTableWidget(ui->tableWidget_2);/*Tab2天顶图初始化*/
m_scene_2 = new QGraphicsScene(this);/*初始化场景*/
m_scene_2->setSceneRect(-width()/2, -height()/2, width(), height());/*将原点移动到控件正中心*/
m_scene_2->setBackgroundBrush(QColor(0, 0, 0));/*设置场景背景为黑色*/
ui->graphicsView_2->setScene(m_scene_2);/*将场景与控件绑定*/
drawSkyView(ui->graphicsView_2->width(),ui->graphicsView_2->height(), m_scene_2);/*调用绘制天顶图的函数*/
/*Tab2按键*/
// connect(ui->pushButton_2, &QPushButton::clicked, this, &StarWindow::on_pushButton_clicked);
connect(ui->pushButton_2, &QPushButton::clicked, this, [this]() {
on_pushButton_clicked(ui->graphicsView_2); // 在 lambda 中调用函数
});
ui->plainTextEdit_2->setReadOnly(true);
TempTest(ui->plainTextEdit_2);
connect(&m_conversionWatcher, &QFutureWatcher<QString>::finished,
this, &StarWindow::onConversionFinished);
}
StarWindow::~StarWindow()
{
delete ui;
}
void StarWindow::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
// 记录当前鼠标位置相对于窗口左上角的偏移
m_dragPosition = event->globalPos() - frameGeometry().topLeft();
event->accept(); // 标记事件已处理
}
else
{
QWidget::mousePressEvent(event); // 其他事件交给父类处理
}
}
void StarWindow::mouseMoveEvent(QMouseEvent *event)
{
/* "&"(按位与):检查某个按钮是否被按下(允许其他按钮同时被按下)。*/
if (event->buttons() & Qt::LeftButton)
{
// 计算新窗口位置并移动
move(event->globalPos() - m_dragPosition);
event->accept(); // 标记事件已处理
}
else
{
QWidget::mouseMoveEvent(event); // 其他事件交给父类处理
}
}
void StarWindow::drawSkyView(int width,int height, QGraphicsScene *q_scene )
{
// 计算绘图半径
float R = 0.0;
float radius = 0.0;
R = qMin(width, height) *0.45f;
// 设置白色画笔
QPen whitePen(Qt::white, 1);
whitePen.setStyle(Qt::CustomDashLine);
int int_el = 0;
int i = 0;
const int els[] = {90, 60, 30, 0};
// 绘制仰角同心圆 - 只显示90, 60, 30, 0四个圆环
for (i = 0; i < 4; ++i)
{
int_el = els[i];
// 使用余弦函数计算半径,使中心为90°,外围为0°
radius = R *cos(int_el *M_PI / 180.0);
// 创建QGraphicsPathItem并绘制椭圆
QGraphicsPathItem *q_circleItem = new QGraphicsPathItem();
QPainterPath circlePath;
circlePath.addEllipse(- radius, - radius, 2 *radius, 2 *radius);
q_circleItem->setPen(whitePen);
q_circleItem->setPath(circlePath);
q_scene->addItem(q_circleItem);
// 绘制仰角度数标签(不显示0度标签,因为在最外围)
if (int_el != 0)
{
QGraphicsTextItem *textItem = new QGraphicsTextItem(QString::number(int_el) + "°");
textItem->setDefaultTextColor(Qt::white);
textItem->setPos( radius - 10, -15);
// qDebug() << "radius-10"<<radius - 10;
q_scene->addItem(textItem);
}
}
whitePen.setStyle(Qt::DashLine);
int int_az=0;
const int azs[] = {0, 45, 90, 135, 180, 225, 270, 315};
float theta = 0.0;
float endRadius = 0.0;
// 绘制方位角参考线
for (i = 0; i < 8; ++i)
{
int_az = azs[i];
theta = (90 - int_az) *M_PI / 180.0f;
endRadius = R *1.00f;
// 创建QGraphicsPathItem并绘制直线
QGraphicsPathItem *lineItem = new QGraphicsPathItem();
QPainterPath linePath;
linePath.lineTo(endRadius *cos(theta), - endRadius *sin(theta));
lineItem->setPen(whitePen);
lineItem->setPath(linePath);
q_scene->addItem(lineItem);
// 绘制方位角标签
if (int_az % 90 == 0)
{
QString label;
switch (int_az)
{
case 0: label = "N"; break;
case 90: label = "E"; break;
case 180: label = "S"; break;
case 270: label = "W"; break;
}
QGraphicsTextItem *textItem = new QGraphicsTextItem(label);
textItem->setDefaultTextColor(Qt::white);
QPointF textPoint(endRadius *cos(theta), - endRadius *sin(theta));
// 根据不同方位调整文字位置
if (int_az == 0)
{ // 北
textPoint.setX(textPoint.x() - 10);
textPoint.setY(textPoint.y() - 20);
}
else if (int_az == 90)
{ // 东
textPoint.setX(textPoint.x() - 4);
textPoint.setY(textPoint.y() - 15);
}
else if (int_az == 180)
{ // 南
textPoint.setX(textPoint.x() - 10);
textPoint.setY(textPoint.y() - 10);
}
else if (int_az == 270)
{ // 西
textPoint.setX(textPoint.x() - 15);
textPoint.setY(textPoint.y() - 15);
}
textItem->setPos(textPoint);
q_scene->addItem(textItem);
}
}
}
void StarWindow::InitTableWidget(QTableWidget *TableWidget)
{
int i = 0;
TableWidget->setRowCount(10); // 5行
TableWidget->setColumnCount(2); // 3列
// 设置表头
// TableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("参数"));
// TableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem("数值"));
TableWidget->verticalHeader()->setHidden(true);
TableWidget->horizontalHeader()->setHidden(true);
// 设置数据
QStringList paramList;
paramList = QStringList({"协调世界时",
"经度",
"纬度",
"高程",
"速度",
"位置精度因子",
"卫星数量",
"水平定位精度",
"垂直定位精度",
"定位模式"});
// 禁用滚动条
TableWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
TableWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// 自动调整行高以适应内容
//TableWidget->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
//for (i = 0; i < 5; ++i)
//{
// QTableWidgetItem *paramItem = new QTableWidgetItem(paramList[i]);
// paramItem->setFlags(paramItem->flags() & ~Qt::ItemIsEditable); // 禁用编辑
// TableWidget->setItem(i, 0, paramItem);
// // 这里可添加获取用户输入数据的逻辑,例如使用QLineEdit作为单元格编辑器
// // 第二列(数值):可编辑
// QTableWidgetItem *valueItem = new QTableWidgetItem("");
// TableWidget->setItem(i, 1, valueItem);
// paramItem = new QTableWidgetItem(paramList[i+5]);
// paramItem->setFlags(paramItem->flags() & ~Qt::ItemIsEditable); // 禁用编辑
// TableWidget->setItem(i, 2, paramItem);
// // 第二列(数值):可编辑
// valueItem = new QTableWidgetItem("");
// TableWidget->setItem(i, 3, valueItem);
//}
for (i = 0; i < 10; ++i)
{
QTableWidgetItem *paramItem = new QTableWidgetItem(paramList[i]);
paramItem->setFlags(paramItem->flags() & ~Qt::ItemIsEditable); // 禁用编辑
TableWidget->setItem(i, 0, paramItem);
// 这里可添加获取用户输入数据的逻辑,例如使用QLineEdit作为单元格编辑器
// 第二列(数值):可编辑
QTableWidgetItem *valueItem = new QTableWidgetItem("");
TableWidget->setItem(i, 1, valueItem);
//paramItem = new QTableWidgetItem(paramList[i+5]);
//paramItem->setFlags(paramItem->flags() & ~Qt::ItemIsEditable); // 禁用编辑
//TableWidget->setItem(i, 2, paramItem);
//
// // 第二列(数值):可编辑
//valueItem = new QTableWidgetItem("");
//TableWidget->setItem(i, 3, valueItem);
}
// 设置列宽
//int charWidth = TableWidget->fontMetrics().averageCharWidth();
//TableWidget->setColumnWidth(0, charWidth * 2);
//TableWidget->setColumnWidth(2, charWidth * 2);
// 调整列宽
//TableWidget->resizeColumnsToContents(); // 先根据内容调整
//TableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch); // 让第二列拉伸填充
// 设置列宽自适应
//TableWidget->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
// 设置列宽
TableWidget->setColumnWidth(0, 100); // 左侧列固定宽度
TableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch); // 右侧列拉伸填充
// 关键:正确计算并设置行高
QTimer::singleShot(0, this, [=]()
{
// 获取表格可用高度(总高度减去边框)
int frameHeight = TableWidget->frameWidth() * 2;
int availableHeight = TableWidget->height() - frameHeight;
// 计算每行高度(平均分配)
int rowHeight = availableHeight / 10;
int i=0;
// 设置所有行的高度
for (i = 0; i < 10; ++i)
{
TableWidget->setRowHeight(i, rowHeight);
}
});
}
void StarWindow::on_pushButton_clicked(MyGraphicsView *m_GraphicsView)
{
if (!m_GraphicsView)
{
qDebug() << "Failed to cast m_GraphicsView to MyQGraphicsView";
return;
}
// 准备卫星数据
double Azimuth = 0.0;
double Elevation = 0.0;
Azimuth = 90.0;
Elevation = 90.0;
QColor color = Qt::red;
QString name = "GPS-11";
// 调用drawSatellitePoint函数设置卫星数据并更新视图
m_GraphicsView->drawSatellitePoint(Azimuth, Elevation, color, name);
// 准备卫星数据
Azimuth = 90.0;
Elevation = 60.0;
color = Qt::red;
name = "GPS-12";
// 调用drawSatellitePoint函数设置卫星数据并更新视图
m_GraphicsView->drawSatellitePoint(Azimuth, Elevation, color, name);
// 准备卫星数据
Azimuth = 45.0;
Elevation = 45.0;
color = Qt::red;
name = "GPS-13";
// 调用drawSatellitePoint函数设置卫星数据并更新视图
m_GraphicsView->drawSatellitePoint(Azimuth, Elevation, color, name);
// 准备卫星数据
Azimuth = 145.0;
Elevation = 45.0;
color = Qt::red;
name = "GPS-14";
// 调用drawSatellitePoint函数设置卫星数据并更新视图
m_GraphicsView->drawSatellitePoint(Azimuth, Elevation, color, name);
}
void StarWindow::TempTest(QPlainTextEdit *m_PlainTextEdit)
{
// 添加测试日志
// 定义所有要发送的日志消息
QStringList logMessages = {
"202305152317,116.39123,39.90756,45.2,12.5,1.8,9,2.3,3.1,GPS",
"202305152422,116.39145,39.90762,45.5,12.7,1.7,10,2.1,3.0,GPS",
"202305152531,116.39167,39.90770,45.8,12.9,1.6,11,2.0,2.9,GLONASS",
"202305152645,116.39189,39.90778,46.1,13.1,1.5,12,1.9,2.8,GLONASS",
"202305152752,116.39211,39.90785,46.4,13.3,1.4,13,1.8,2.7,BeiDou",
"202305152857,116.39233,39.90793,46.7,13.5,1.3,14,1.7,2.6,BeiDou",
"202305153003,116.39255,39.90801,47.0,13.7,1.2,15,1.6,2.5,Galileo",
"202305153112,116.39277,39.90809,47.3,13.9,1.1,16,1.5,2.4,Galileo",
"202305153224,116.39299,39.90817,47.6,14.1,1.0,17,1.4,2.3,Galileo",
"202305153335,116.39321,39.90825,47.9,14.3,0.9,18,1.3,2.2,Galileo"
};
// 创建定时器
QTimer *timer = new QTimer(this);
int currentIndex = 0; // 当前要发送的消息索引
// 连接定时器信号
connect(timer, &QTimer::timeout, this, [=]() mutable {
if (currentIndex < logMessages.size()) {
// 发送当前消息
// AppendLog(m_PlainTextEdit, logMessages[currentIndex]);
QByteArray newData = logMessages[currentIndex].toUtf8();
// 模拟数据接收处理
processReceivedData(newData, m_PlainTextEdit);
currentIndex++;
} else {
// 所有消息发送完毕,停止定时器
timer->stop();
timer->deleteLater(); // 释放定时器内存
}
});
// 启动定时器,每隔500毫秒(0.5秒)触发一次
timer->start(500);
}
void StarWindow::AppendLog(QPlainTextEdit *m_PlainTextEdit,const QString &q_Message)
{
QString timestamp;
QColor color;
timestamp = QDateTime::currentDateTime().toString("[yyyy-MM-dd hh:mm:ss]");
// 确保每条日志以换行符结束
QString message = q_Message;
if (!message.endsWith('\n'))
message += '\n';
//最终数据格式
QString Str_FullLog;
Str_FullLog = QString("%1 %2").arg(timestamp, message);
// 在GUI中显示(修正格式设置逻辑)
QTextCursor cursor = m_PlainTextEdit->textCursor();
// 1. 移动光标到末尾
cursor.movePosition(QTextCursor::End);
// 2. 设置字符格式
QTextCharFormat format;
format.setForeground(color);
cursor.setCharFormat(format);
// 插入带格式的文本
cursor.insertText(Str_FullLog);
m_PlainTextEdit->setTextCursor(cursor);
// 强制刷新UI并滚动到底部
m_PlainTextEdit->ensureCursorVisible();
QScrollBar* scrollBar = m_PlainTextEdit->verticalScrollBar();
scrollBar->setValue(scrollBar->maximum());
}
// 清除按钮响应函数
/*点击按钮时将文本框显示文字置空,实现清除*/
void StarWindow::on_pushButton_clear_clicked()
{
// ui->plainTextEdit->setPlainText("");
m_shouldClear = true;
ui->plainTextEdit->clear();
m_accumulatedData.clear();
}
// // 暂停按钮响应函数
// /* 点击按钮时改变状态量,对显示文本接口的输入造成影响,实现暂停*/
// void StarWindow::on_pushButton_pause_clicked()
// {
// if(PauseState == false)
// {
// ui->pushButton_pause->setText("继续");
// PauseState = true;
// }
// else
// {
// ui->pushButton_pause->setText("暂停");
// PauseState = false;
// }
// }
// // 十六进制显示复选框
// /* 勾选复选框改变状态量,对显示文本接口的输入造成影响,实现十六进制显示*/
// void StarWindow::on_checkBox_2_checkStateChanged(const Qt::CheckState &arg1)
// {
// if(HexState == false)
// {
// HexState = true;
// }
// else
// {
// HexState = false;
// }
// }
// // 二进制显示复选框
// /* 勾选复选框改变状态量,对显示文本接口的输入造成影响,实现二进制显示*/
// void StarWindow::on_checkBox_checkStateChanged(const Qt::CheckState &arg1)
// {
// if(BinState == false)
// {
// BinState = true;
// }
// else
// {
// BinState = false;
// }
// }
// 暂停按钮响应函数
/* 点击按钮时改变状态量,对显示文本接口的输入造成影响,实现暂停*/
// void StarWindow::on_pushButton_pause_clicked()
// {
// if(PauseState == false)
// {
// ui->pushButton_pause->setText("继续");
// PauseState = true;
// }
// else
// {
// ui->pushButton_pause->setText("暂停");
// PauseState = false;
// }
// }
// 修改数据接收处理
void StarWindow::processReceivedData(const QByteArray &newData, QPlainTextEdit *m_PlainTextEdit)
{
if (m_shouldClear) {
m_shouldClear = false;
m_PlainTextEdit->clear();
m_lastConvertedText.clear();
}
// 直接追加原始数据到文本框
m_PlainTextEdit->appendPlainText(QString::fromUtf8(newData));
if (!PauseState) {
updateDataDisplay();
}
}
// QString StarWindow::convertDataAsync(const QString& text, bool binState, bool hexState)
// {
// if (text.isEmpty()) return "";
// QString result;
// QStringList lines = text.split('\n', Qt::SkipEmptyParts);
// if (binState) {
// result += "Binary View:\n";
// foreach (const QString& line, lines) {
// QByteArray data = line.toUtf8();
// QString binaryLine;
// for (int i = 0; i < data.size(); ++i) {
// // 处理特殊字符
// switch(data[i]) {
// case '-': case ',': case ':': case '.': case '+': case 'T': case 'Z':
// binaryLine += QString(" %1 ").arg(QChar(data[i]));
// break;
// default:
// if (isalnum(data[i])) {
// binaryLine += QString(" %1").arg(static_cast<quint8>(data[i]), 8, 2, QChar('0'));
// } else {
// binaryLine += QString(" %1 ").arg(QChar(data[i]));
// }
// }
// }
// result += binaryLine.trimmed() + "\n";
// }
// result += "\n";
// }
// if (hexState) {
// if (!result.isEmpty()) result += "\n";
// result += "Hex View:\n";
// foreach (const QString& line, lines) {
// QByteArray data = line.toUtf8();
// QString hexLine;
// for (int i = 0; i < data.size(); ++i) {
// // 处理特殊字符
// switch(data[i]) {
// case '-': case ',': case ':': case '.': case '+': case 'T': case 'Z':
// hexLine += QString(" %1 ").arg(QChar(data[i]));
// break;
// default:
// if (isalnum(data[i])) {
// hexLine += QString(" %1").arg(static_cast<quint8>(data[i]), 2, 16, QChar('0')).toUpper();
// } else {
// hexLine += QString(" %1 ").arg(QChar(data[i]));
// }
// }
// }
// result += hexLine.trimmed() + "\n";
// }
// result += "\n";
// }
// return (binState || hexState) ? result : text;
// }
QString StarWindow::convertDataToHex(const QString& text)
{
if (text.isEmpty()) return "";
QString result = "十六进制视图:\n"; // 统一标题格式
QStringList lines = text.split('\n', Qt::SkipEmptyParts);
foreach (const QString& line, lines) {
if (line.trimmed().isEmpty()) continue;
QString hexLine;
QStringList parts = line.split(',', Qt::SkipEmptyParts);
for (const QString& part : parts) {
if (part.isEmpty()) continue;
// 处理时间戳
if (part.length() == 12 && part.toLongLong() > 100000000000) {
QDateTime dt = QDateTime::fromString(part, "yyyyMMddhhmm");
if (dt.isValid()) {
hexLine += dt.toString("yyyy-MM-dd hh:mm") + " ";
continue;
}
}
bool isNumber = false;
part.toDouble(&isNumber);
if (isNumber) {
if (part.contains('.')) {
QStringList numParts = part.split('.');
bool ok1, ok2;
int intPart = numParts[0].toInt(&ok1);
int decPart = numParts[1].toInt(&ok2);
if (ok1 && ok2) {
hexLine += QString("%1.%2").arg(intPart, 0, 16).arg(decPart, 0, 16).toUpper() + " ";
}
} else {
bool ok;
int num = part.toInt(&ok);
if (ok) {
hexLine += QString("%1").arg(num, 0, 16).toUpper() + " ";
}
}
} else {
hexLine += part + " ";
}
}
result += hexLine.trimmed() + "\n";
}
return result;
}
QString StarWindow::convertDataToBinary(const QString& text)
{
if (text.isEmpty()) return "";
QString result = "二进制视图:\n"; // 只在开头显示一次标题
QStringList lines = text.split('\n', Qt::SkipEmptyParts);
foreach (const QString& line, lines) {
if (line.trimmed().isEmpty()) continue;
QString binaryLine;
QStringList parts = line.split(',', Qt::SkipEmptyParts);
for (const QString& part : parts) {
if (part.isEmpty()) continue;
// 处理时间戳(特殊格式)
if (part.length() == 12 && part.toLongLong() > 100000000000) {
QDateTime dt = QDateTime::fromString(part, "yyyyMMddhhmm");
if (dt.isValid()) {
binaryLine += dt.toString("yyyy-MM-dd hh:mm") + " ";
continue;
}
}
// 检查是否是数字
bool isNumber = false;
part.toDouble(&isNumber);
if (isNumber) {
// 处理小数
if (part.contains('.')) {
QStringList numParts = part.split('.');
bool ok1, ok2;
qlonglong intPart = numParts[0].toLongLong(&ok1);
int decPart = numParts[1].toInt(&ok2);
if (ok1 && ok2) {
// 整数部分(固定16位)
binaryLine += QString("%1").arg(intPart, 16, 2, QChar('0'));
// 小数部分(固定8位)
if (decPart > 0) {
binaryLine += ".";
binaryLine += QString("%1").arg(decPart, 8, 2, QChar('0'));
}
binaryLine += " ";
}
} else {
// 纯整数(固定16位)
bool ok;
qlonglong num = part.toLongLong(&ok);
if (ok) {
binaryLine += QString("%1").arg(num, 16, 2, QChar('0')) + " ";
}
}
} else {
// 非数字部分(如GPS、GLONASS等)
binaryLine += part + " ";
}
}
result += binaryLine.trimmed() + "\n"; // 单一行间隔
}
return result;
}
QString StarWindow::convertDataAsync(const QString& text, bool binState, bool hexState)
{
if (text.isEmpty()) return "";
QString result;
if (binState && hexState) {
result = "=== 二进制视图 ===\n" + convertDataToBinary(text) +
"\n=== 十六进制视图 ===\n" + convertDataToHex(text);
}
else if (binState) {
result = convertDataToBinary(text);
}
else if (hexState) {
result = convertDataToHex(text);
}
else {
result = text; // 原始文本
}
return result;
}
// 修改后的更新显示函数
void StarWindow::updateDataDisplay()
{
if (PauseState) return;
QString currentText = ui->plainTextEdit->toPlainText();
if (currentText == m_lastConvertedText) return;
// 取消之前的转换任务
if (m_conversionWatcher.isRunning()) {
m_conversionWatcher.cancel();
m_conversionWatcher.waitForFinished();
}
// 启动异步转换
m_lastConvertedText = currentText;
m_conversionWatcher.setFuture(QtConcurrent::run([=]() {
return convertDataAsync(currentText, BinState, HexState);
}));
}
// 修改复选框状态处理
void StarWindow::on_checkBox_stateChanged(int state)
{
BinState = (state == Qt::Checked);
updateDataDisplay();
}
void StarWindow::on_checkBox_2_stateChanged(int state)
{
HexState = (state == Qt::Checked);
updateDataDisplay();
}
// 修改暂停按钮处理函数
void StarWindow::on_pushButton_pause_clicked()
{
PauseState = !PauseState;
ui->pushButton_pause->setText(PauseState ? "继续" : "暂停");
if (!PauseState) {
updateDataDisplay();
}
}
// 添加新的槽函数
void StarWindow::onConversionFinished()
{
if (!m_conversionWatcher.isCanceled()) {
QString result = m_conversionWatcher.result();
if (!PauseState && ui->plainTextEdit->toPlainText() != result) {
ui->plainTextEdit->setPlainText(result);
ui->plainTextEdit->verticalScrollBar()->setValue(
ui->plainTextEdit->verticalScrollBar()->maximum());
}
}
m_conversionPending = false;
}
,请修改2进制转换部分
最新发布