undefined reference to 'Widget::on_btnClear_clicked()'

博客指出槽函数存在只有定义却无具体实现的问题,针对此问题给出的解决方法是补充具体实现代码。

问题:槽函数只有定义,但是没有具体实现。

方法:补充具体实现代码。

#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); setWindowIcon(QIcon(":")); // 串口状态改变事件 connect(&comm, SIGNAL(onPortStateChange(bool)), this, SLOT(onPortStateChange(bool))); // 接收到 CAN 消息 connect(&comm, SIGNAL(onCanMsgRecv(CanMsg&)), this, SLOT(onCanMsgRecv(CanMsg&))); // qDebug() << "JTTest"; // 温区监控面板 tempView = new TempView(); // 接收消息接口 connect(&comm, SIGNAL(onCanMsgRecv(CanMsg&)), tempView, SLOT(onCanMsgRecv(CanMsg&))); } MainWindow::~MainWindow() { delete ui; } // 打开串口 void MainWindow::on_pushButton_OpenSerialPort_clicked() { QString port = ui->comboBox_SerialPort->currentText().split(':').at(0); // 允许选择串口号说明没有打开串口 if(ui->comboBox_SerialPort->isEnabled()) { comm.open(port); } else { comm.close(); } } // 串口状态变化 void MainWindow::onPortStateChange(bool isOpen) { if(isOpen) { qDebug() << "串口已打开"; ui->comboBox_SerialPort->setEnabled(false); ui->pushButton_OpenSerialPort->setText("关闭"); } else { qDebug() << "串口已关闭"; ui->pushButton_OpenSerialPort->setText("打开"); ui->comboBox_SerialPort->setEnabled(true); } } // 接收到 CAN 消息 void MainWindow::onCanMsgRecv(CanMsg &canMsg) { // 接收到温度数据 if(canMsg.msgType == MSG_TEMP_MEASURE) { // int tempMeasureId = canMsg.addr; // int tempMeasureCh = canMsg.index; // float value = canMsg.getFloat(); // 写日志 // tempLog.writeLog(tempMeasureId, tempMeasureCh, value); } // 接收到温度错误信息 else if(canMsg.msgType == MSG_TEMP_MEASURE_ERROR) { // int tempMeasureId = canMsg.addr; // int tempMeasureCh = canMsg.index; // 温度错误则写入 -999 // tempLog.writeLog(tempMeasureId, tempMeasureCh, -999); } } // 温控板卡 void MainWindow::on_pushButton_TempCtrlBoard_clicked() { TempCtrlBoard* obj = new TempCtrlBoard(); // 发送消息接口 connect(obj, SIGNAL(canMsgSend(CanMsg&)), &comm, SLOT(canMsgSend(CanMsg&))); // 接收消息接口 connect(&comm, SIGNAL(onCanMsgRecv(CanMsg&)), obj, SLOT(onCanMsgRecv(CanMsg&))); // 添加到面板列表 viewListMutex.lock(); QVariant var; var.setValue(obj); viewList.append(var); viewListMutex.unlock(); // 显示窗口 obj->show(); } // 数字量输入板卡 void MainWindow::on_pushButton_DigitalInputBoard_clicked() { DigitalInputBoard* obj = new DigitalInputBoard(); // 发送消息接口 connect(obj, SIGNAL(canMsgSend(CanMsg&)), &comm, SLOT(canMsgSend(CanMsg&))); // 接收消息接口 connect(&comm, SIGNAL(onCanMsgRecv(CanMsg&)), obj, SLOT(onCanMsgRecv(CanMsg&))); // 添加到面板列表 viewListMutex.lock(); QVariant var; var.setValue(obj); viewList.append(var); viewListMutex.unlock(); obj->show(); } // 继电器控制板卡 void MainWindow::on_pushButton_RelayCtrlBoard_clicked() { RelayCtrlBoard* obj = new RelayCtrlBoard(); // 发送消息接口 connect(obj, SIGNAL(canMsgSend(CanMsg&)), &comm, SLOT(canMsgSend(CanMsg&))); // 接收消息接口 connect(&comm, SIGNAL(onCanMsgRecv(CanMsg&)), obj, SLOT(onCanMsgRecv(CanMsg&))); obj->show(); } // CAN协议运控电机控制 void MainWindow::on_pushButton_HDChianSpeedCtrl_clicked() { hd_chian_ctrl* obj = new hd_chian_ctrl(); connect(obj, SIGNAL(canMsgSend(CanMsg&)), &comm, SLOT(canMsgSend(CanMsg&))); // 接收消息接口 connect(&comm, SIGNAL(onCanMsgRecv(CanMsg&)), obj, SLOT(onCanMsgRecv(CanMsg&))); obj->show(); } // CAN协议直流风机控制 void MainWindow::on_pushButton_HDFanSpeedCtrl_clicked() { hd_fan_ctrl* obj = new hd_fan_ctrl(); connect(obj, SIGNAL(canMsgSend(CanMsg&)), &comm, SLOT(canMsgSend(CanMsg&))); // 接收消息接口 connect(&comm, SIGNAL(onCanMsgRecv(CanMsg&)), obj, SLOT(onCanMsgRecv(CanMsg&))); obj->show(); } void MainWindow::on_pushButton_CommDetect_clicked() { CommDetect* obj = new CommDetect(); //can消息收发信号绑定 connect(&comm, SIGNAL(onCanMsgRecv(CanMsg&)), obj, SLOT(onCanMsgRecv(CanMsg&))); obj->show(); } void MainWindow::on_actionTemp_Zone_Watching_triggered() { tempView->show(); } void MainWindow::on_actionDelete_Temp_Record_Database_triggered() { QMessageBox::StandardButton result = QMessageBox::question(NULL, "警告", "是否删除数据记录?", QMessageBox::Yes | QMessageBox::No, QMessageBox::No); if(result == QMessageBox::Yes) { // tempLog.deleteLog(); qDebug() << "数据记录已删除"; } } void MainWindow::on_pushButton_RS485Board_clicked() { RS485Board* obj = new RS485Board(); // 发送消息接口 connect(obj, SIGNAL(canMsgSend(CanMsg&)), &comm, SLOT(canMsgSend(CanMsg&))); // 接收消息接口 connect(&comm, SIGNAL(onCanMsgRecv(CanMsg&)), obj, SLOT(onCanMsgRecv(CanMsg&))); obj->show(); } 如何添加呢?
05-13
package com.example.myapplication; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.TextView; import com.example.myapplication.databinding.ActivityMainBinding; import net.objecthunter.exp4j.Expression; import net.objecthunter.exp4j.ExpressionBuilder; public class MainActivity extends AppCompatActivity { private ActivityMainBinding binding; private String currentInput = ""; private String expression = ""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityMainBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); // 设置所有按钮的点击监听 setButtonListeners(); } private void setButtonListeners() { // 所有按钮ID数组 int[] buttonIds = { R.id.btn0, R.id.btn1, R.id.btn2, R.id.btn3, R.id.btn4, R.id.btn5, R.id.btn6, R.id.btn7, R.id.btn8, R.id.btn9, R.id.btnAdd, R.id.btnSubtract, R.id.btnMultiply, R.id.btnDivide, R.id.btnDot, R.id.btnPercent, R.id.btnPlusMinus, R.id.btnClear, R.id.btnDelete, R.id.btnEquals }; View.OnClickListener listener = v -> { // 获取按钮文本(安全处理 null) String text = ((TextView) v).getText().toString(); if (v.getId() == R.id.btnClear) { currentInput = ""; expression = ""; binding.textViewHistory.setText(""); binding.editTextDisplay.setText("0"); } else if (v.getId() == R.id.btnDelete) { if (!currentInput.isEmpty()) { currentInput = currentInput.substring(0, currentInput.length() - 1); binding.editTextDisplay.setText(currentInput.isEmpty() ? "0" : currentInput); } } else if (v.getId() == R.id.btnEquals) { try { Expression exp = new ExpressionBuilder(expression.isEmpty() ? currentInput : expression).build(); double result = exp.evaluate(); long longResult = (long) result; String displayResult = (result == (double) longResult) ? String.valueOf(longResult) : String.valueOf(result); binding.textViewHistory.setText((expression.isEmpty() ? currentInput : expression) + " ="); binding.editTextDisplay.setText(displayResult); currentInput = displayResult; expression = ""; } catch (Exception e) { binding.editTextDisplay.setText("Error"); } } else if (v.getId() == R.id.btnPlusMinus) { if (!currentInput.isEmpty() && !currentInput.equals("0")) { if (currentInput.startsWith("-")) { currentInput = currentInput.substring(1); } else { currentInput = "-" + currentInput; } binding.editTextDisplay.setText(currentInput); } } else if (v.getId() == R.id.btnPercent) { if (!currentInput.isEmpty()) { double val = Double.parseDouble(currentInput) / 100; currentInput = String.valueOf(val); binding.editTextDisplay.setText(currentInput); } } else { // 处理数字和操作符 if (isOperator(text)) { if (!currentInput.isEmpty()) { expression = currentInput + text; binding.textViewHistory.setText(expression); currentInput = ""; } else if (!expression.isEmpty()) { expression = expression.replaceAll("[+\\-×÷]$", text); binding.textViewHistory.setText(expression); } } else { currentInput += text; binding.editTextDisplay.setText(currentInput); } } }; // 为每个按钮设置监听器 for (int id : buttonIds) { View btn = binding.getRoot().findViewById(id); // 或直接 binding.btn0 等 if (btn != null) { btn.setOnClickListener(listener); } } } private boolean isOperator(String str) { return "+".equals(str) || "-".equals(str) || "×".equals(str) || "÷".equals(str); } } <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#F5F5F5" android:padding="8dp"> <!-- 历史表达式显示 --> <TextView android:id="@+id/textViewHistory" android:layout_width="0dp" android:layout_height="wrap_content" android:text="" android:textSize="16sp" android:textColor="#666666" android:gravity="end" android:padding="12dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" /> <!-- 当前输入/结果显示 --> <EditText android:id="@+id/editTextDisplay" android:layout_width="0dp" android:layout_height="wrap_content" android:text="0" android:textSize="32sp" android:textColor="#000000" android:gravity="end" android:padding="16dp" android:background="@android:color/transparent" android:focusable="false" android:cursorVisible="false" app:layout_constraintTop_toBottomOf="@id/textViewHistory" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" /> <!-- 按钮网格容器 --> <GridLayout android:layout_width="0dp" android:layout_height="wrap_content" android:columnCount="4" android:rowCount="5" android:useDefaultMargins="true" app:layout_constraintTop_toBottomOf="@id/editTextDisplay" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent"> <!-- 第一行:清除、正负、百分比、除法 --> <Button android:id="@+id/btnClear" android:layout_width="0dp" android:layout_height="60dp" android:layout_columnWeight="1" android:layout_margin="4dp" android:text="C" android:textSize="18sp" android:textColor="#FFFFFF" android:backgroundTint="#FF9500" style="?android:attr/buttonStyle" /> <Button android:id="@+id/btnPlusMinus" android:layout_width="0dp" android:layout_height="60dp" android:layout_columnWeight="1" android:layout_margin="4dp" android:text="+/-" android:textSize="18sp" android:textColor="#000000" android:backgroundTint="#E0E0E0" style="?android:attr/buttonStyle" /> <Button android:id="@+id/btnPercent" android:layout_width="0dp" android:layout_height="60dp" android:layout_columnWeight="1" android:layout_margin="4dp" android:text="%" android:textSize="18sp" android:textColor="#000000" android:backgroundTint="#E0E0E0" style="?android:attr/buttonStyle" /> <Button android:id="@+id/btnDivide" android:layout_width="0dp" android:layout_height="60dp" android:layout_columnWeight="1" android:layout_margin="4dp" android:text="÷" android:textSize="18sp" android:textColor="#FFFFFF" android:backgroundTint="#FF9500" style="?android:attr/buttonStyle" /> <!-- 第二行:7,8,9,乘法 --> <Button android:id="@+id/btn7" android:layout_width="0dp" android:layout_height="60dp" android:layout_columnWeight="1" android:layout_margin="4dp" android:text="7" android:textSize="18sp" android:textColor="#000000" android:backgroundTint="#E0E0E0" style="?android:attr/buttonStyle" /> <Button android:id="@+id/btn8" android:layout_width="0dp" android:layout_height="60dp" android:layout_columnWeight="1" android:layout_margin="4dp" android:text="8" android:textSize="18sp" android:textColor="#000000" android:backgroundTint="#E0E0E0" style="?android:attr/buttonStyle" /> <Button android:id="@+id/btn9" android:layout_width="0dp" android:layout_height="60dp" android:layout_columnWeight="1" android:layout_margin="4dp" android:text="9" android:textSize="18sp" android:textColor="#000000" android:backgroundTint="#E0E0E0" style="?android:attr/buttonStyle" /> <Button android:id="@+id/btnMultiply" android:layout_width="0dp" android:layout_height="60dp" android:layout_columnWeight="1" android:layout_margin="4dp" android:text="×" android:textSize="18sp" android:textColor="#FFFFFF" android:backgroundTint="#FF9500" style="?android:attr/buttonStyle" /> <!-- 第三行:4,5,6,减法 --> <Button android:id="@+id/btn4" android:layout_width="0dp" android:layout_height="60dp" android:layout_columnWeight="1" android:layout_margin="4dp" android:text="4" android:textSize="18sp" android:textColor="#000000" android:backgroundTint="#E0E0E0" style="?android:attr/buttonStyle" /> <Button android:id="@+id/btn5" android:layout_width="0dp" android:layout_height="60dp" android:layout_columnWeight="1" android:layout_margin="4dp" android:text="5" android:textSize="18sp" android:textColor="#000000" android:backgroundTint="#E0E0E0" style="?android:attr/buttonStyle" /> <Button android:id="@+id/btn6" android:layout_width="0dp" android:layout_height="60dp" android:layout_columnWeight="1" android:layout_margin="4dp" android:text="6" android:textSize="18sp" android:textColor="#000000" android:backgroundTint="#E0E0E0" style="?android:attr/buttonStyle" /> <Button android:id="@+id/btnSubtract" android:layout_width="0dp" android:layout_height="60dp" android:layout_columnWeight="1" android:layout_margin="4dp" android:text="-" android:textSize="18sp" android:textColor="#FFFFFF" android:backgroundTint="#FF9500" style="?android:attr/buttonStyle" /> <!-- 第四行:1,2,3,加法 --> <Button android:id="@+id/btn1" android:layout_width="0dp" android:layout_height="60dp" android:layout_columnWeight="1" android:layout_margin="4dp" android:text="1" android:textSize="18sp" android:textColor="#000000" android:backgroundTint="#E0E0E0" style="?android:attr/buttonStyle" /> <Button android:id="@+id/btn2" android:layout_width="0dp" android:layout_height="60dp" android:layout_columnWeight="1" android:layout_margin="4dp" android:text="2" android:textSize="18sp" android:textColor="#000000" android:backgroundTint="#E0E0E0" style="?android:attr/buttonStyle" /> <Button android:id="@+id/btn3" android:layout_width="0dp" android:layout_height="60dp" android:layout_columnWeight="1" android:layout_margin="4dp" android:text="3" android:textSize="18sp" android:textColor="#000000" android:backgroundTint="#E0E0E0" style="?android:attr/buttonStyle" /> <Button android:id="@+id/btnAdd" android:layout_width="0dp" android:layout_height="60dp" android:layout_columnWeight="1" android:layout_margin="4dp" android:text="+" android:textSize="18sp" android:textColor="#FFFFFF" android:backgroundTint="#FF9500" style="?android:attr/buttonStyle" /> <!-- 第五行:0,小数点,删除,等于 --> <Button android:id="@+id/btn0" android:layout_width="0dp" android:layout_height="60dp" android:layout_columnWeight="2" android:layout_columnSpan="2" android:layout_margin="4dp" android:text="0" android:textSize="18sp" android:textColor="#000000" android:backgroundTint="#E0E0E0" style="?android:attr/buttonStyle" /> <Button android:id="@+id/btnDot" android:layout_width="0dp" android:layout_height="60dp" android:layout_columnWeight="1" android:layout_margin="4dp" android:text="." android:textSize="18sp" android:textColor="#000000" android:backgroundTint="#E0E0E0" style="?android:attr/buttonStyle" /> <ImageButton android:id="@+id/btnDelete" android:layout_width="0dp" android:layout_height="60dp" android:layout_columnWeight="1" android:layout_margin="4dp" android:src="@drawable/ic_backspace" android:backgroundTint="#E0E0E0" android:contentDescription="Delete" style="?android:attr/buttonStyle" /> <Button android:id="@+id/btnEquals" android:layout_width="0dp" android:layout_height="60dp" android:layout_columnWeight="1" android:layout_margin="4dp" android:text="=" android:textSize="18sp" android:textColor="#FFFFFF" android:backgroundTint="#FF9500" style="?android:attr/buttonStyle" /> </GridLayout> </androidx.constraintlayout.widget.ConstraintLayout>使用android Studio进行开发仿 Windows10 计算器 计算器是日常生活中常用的工具,下面仿写Windows10系统自带的计算器。计算器的页面由8部分组成,利用权重垂直方向分配高度,使组件占满整个屏幕,见图 4.12。第1 部分由EditText组成,重心向右。第2部分由水平方向的LinearLayout组成,内部包含6个TextVicw,水平方向6等分,注意字体颜色。第3部分由水平方向的LinearLayout组成,内部包含 Button和 ImageButton,水平方向4等分,ImageButton用于展示无法文本输出的“删除按键”,Button用于展示可以文本输出的其余按键。第4至8部分与第3部分设计的思路一致。注意采用Background 设置按钮不同的背景色。
最新发布
09-23
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QSerialPortInfo> #include <QMessageBox> #include <QFileDialog> #include <QTextStream> #include <QtCharts/QValueAxis> #include <QChart> #include <QLineSeries> #include <QTimer> #include <QByteArray> #include <QtEndian> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); // 初始化串口对象 serial = new QSerialPort(this); connect(serial, &QSerialPort::readyRead, this, &MainWindow::readSerialData); // 初始化图表 setupChart(); // 初始化定时器 plotTimer = new QTimer(this); connect(plotTimer, &QTimer::timeout, this, &MainWindow::updatePlot); plotTimer->start(10); // 每200ms更新一次图表 saveTimer = new QTimer(this); connect(saveTimer, &QTimer::timeout, this, &MainWindow::saveToFile); // 扫描可用串口 scanSerialPorts(); // 设置默认参数 ui->cbBaudRate->setCurrentText("9600"); ui->cbDataBits->setCurrentText("8"); ui->cbParity->setCurrentText("None"); ui->cbStopBits->setCurrentText("1"); // 设置日志文件 logFile.setFileName(QDateTime::currentDateTime().toString("yyyyMMdd_hhmmss") + "_voltage_log.csv"); } MainWindow::~MainWindow() { if (serial->isOpen()) serial->close(); if (logFile.isOpen()) logFile.close(); delete ui; } void MainWindow::scanSerialPorts() { ui->cbPort->clear(); foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { ui->cbPort->addItem(info.portName()); } } void MainWindow::setupChart() { // 创建图表 chart = new QChart(); chart->setTitle("实时电压监测"); chart->legend()->hide(); // 创建坐标轴 QValueAxis *axisX = new QValueAxis; axisX->setTitleText("时间 (秒)"); axisX->setRange(0, 10); axisX->setLabelFormat("%.1f"); QValueAxis *axisY = new QValueAxis; axisY->setTitleText("电压 (V)"); axisY->setRange(0, maxVoltage); axisY->setTickCount(7); // 创建数据系列 voltageSeries = new QLineSeries(); chart->addSeries(voltageSeries); chart->addAxis(axisX, Qt::AlignBottom); chart->addAxis(axisY, Qt::AlignLeft); voltageSeries->attachAxis(axisX); voltageSeries->attachAxis(axisY); // 设置图表视图 QChartView *chartView = new QChartView(chart); chartView->setRenderHint(QPainter::Antialiasing); ui->chartLayout->addWidget(chartView); } void MainWindow::on_btnConnect_clicked() { if (serial->isOpen()) { // 断开连接:新增保存剩余数据 serial->close(); if (logFile.isOpen()) { saveToFile(); logFile.close(); } saveTimer->stop(); ui->btnConnect->setText("连接串口"); ui->statusbar->showMessage("串口已断开"); } else { // 配置串口 serial->setPortName(ui->cbPort->currentText()); serial->setBaudRate(ui->cbBaudRate->currentText().toInt()); // 数据位配置 QString dataBitsStr = ui->cbDataBits->currentText(); if (dataBitsStr == "5") serial->setDataBits(QSerialPort::Data5); else if (dataBitsStr == "6") serial->setDataBits(QSerialPort::Data6); else if (dataBitsStr == "7") serial->setDataBits(QSerialPort::Data7); else if (dataBitsStr == "8") serial->setDataBits(QSerialPort::Data8); // 校验位配置 if (ui->cbParity->currentText() == "None") serial->setParity(QSerialPort::NoParity); else if (ui->cbParity->currentText() == "Even") serial->setParity(QSerialPort::EvenParity); else if (ui->cbParity->currentText() == "Odd") serial->setParity(QSerialPort::OddParity); // 停止位配置 if (ui->cbStopBits->currentText() == "1") serial->setStopBits(QSerialPort::OneStop); else if (ui->cbStopBits->currentText() == "1.5") serial->setStopBits(QSerialPort::OneAndHalfStop); else if (ui->cbStopBits->currentText() == "2") serial->setStopBits(QSerialPort::TwoStop); // 打开串口 if (serial->open(QIODevice::ReadWrite)) { ui->btnConnect->setText("断开连接"); ui->statusbar->showMessage("已连接: " + ui->cbPort->currentText()); // 开启数据保存 if (logFile.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)) { QTextStream stream(&logFile); stream << "Timestamp,Voltage(V)\n"; saveTimer->start(1000); // 每秒保存一次 } } else { QMessageBox::critical(this, "错误", "无法打开串口: " + serial->errorString()); } } } void MainWindow::on_btnClear_clicked() { voltageData.clear(); plotPoints.clear(); voltageSeries->clear(); ui->listWidget->clear(); chart->axisX()->setRange(0, 10); } void MainWindow::readSerialData() { static QByteArray buffer; QByteArray newData = serial->readAll(); buffer += newData; qDebug() << "Received" << newData.size() << "bytes, total buffer:" << buffer.size(); qDebug() << "Raw data (hex):" << newData.toHex(); // 处理完整的数据帧 (4字节浮点数) while (buffer.size() >= 4) { // 提取4字节数据 QByteArray frameData = buffer.left(4); buffer = buffer.mid(4); // 解析为浮点数 float voltage; memcpy(&voltage, frameData.constData(), 4); qDebug() << "Parsed voltage:" << voltage << "Hex:" << frameData.toHex(); // 验证数据范围 if (voltage >= 0 && voltage <= 3.3) { // 添加到界面 QDateTime now = QDateTime::currentDateTime(); QString display = now.toString("hh:mm:ss") + " - " + QString::number(voltage, 'f', 2) + "V"; ui->listWidget->addItem(display); ui->listWidget->scrollToBottom(); // 添加到图表数据 double timeSec = now.toMSecsSinceEpoch() / 1000.0; plotPoints.append(QPointF(timeSec, voltage)); if (plotPoints.size() > maxPoints) { plotPoints.removeFirst(); } // 添加到保存队列 voltageData.append(voltage); } else { qWarning() << "Invalid voltage value:" << voltage << "Hex:" << frameData.toHex(); // 如果数据无效,尝试丢弃一个字节并重新尝试 if (buffer.size() > 0) { buffer = buffer.mid(1); qDebug() << "Discarded 1 byte, trying to resync"; } } } } void MainWindow::updatePlot() { if (plotPoints.isEmpty()) return; // 计算时间范围 (显示最近10秒数据) double currentTime = QDateTime::currentMSecsSinceEpoch() / 1000.0; double minTime = currentTime - 10; // 更新数据系列 voltageSeries->clear(); for (const QPointF &point : plotPoints) { if (point.x() >= minTime) { voltageSeries->append(point.x() - minTime, point.y()); } } // 更新X轴范围 chart->axisX()->setRange(0, 10); } void MainWindow::saveToFile() { if (logFile.isOpen() && !voltageData.isEmpty()) { QTextStream stream(&logFile); QDateTime now = QDateTime::currentDateTime(); for (double voltage : voltageData) { stream << now.toString("yyyy-MM-dd hh:mm:ss.zzz") << "," << QString::number(voltage, 'f', 3) << "\n"; } voltageData.clear(); } } void MainWindow::on_btnRefresh_clicked() { scanSerialPorts(); // 调用现有函数,重新扫描可用串口 ui->statusbar->showMessage("已刷新串口列表"); // 可选:添加状态提示 } void MainWindow::on_pushButton_clicked() { } 对此程序进行修改
09-01
import sys from PyQt5.QtWidgets import QApplication, QWidget , QMainWindow from Calui1 import Ui_Form class Mywindow(QWidget,Ui_Form): def init(self): super(Mywindow,self).init() self.setupUi(self) def btnClear_clicked(self): self.lineEdit.clear() def btn1(self): self.lineEdit.insert("1") def btn2(self): self.lineEdit.insert("2") def btn3(self): self.lineEdit.insert("3") def btn4(self): self.lineEdit.insert("4") def btn5(self): self.lineEdit.insert("5") def btn6(self): self.lineEdit.insert("6") def btn7(self): self.lineEdit.insert("7") def btn8(self): self.lineEdit.insert("8") def btn9(self): self.lineEdit.insert("9") def btn0(self): self.lineEdit.insert("0") def btn_plus(self): self.lineEdit.insert("+") def btn_sub(self): self.lineEdit.insert("-") def btn_mul(self): self.lineEdit.insert("*") def btn_div(self): self.lineEdit.insert("/") def btnequal(self): text=self.lineEdit.text() self.lineEdit.insert("= %.2f" %(eval(text))) if name=='main': app=QApplication(sys.argv) win=Mywindow() win.pushButton_7.clicked.connect(win.btnClear_clicked()) win.pushButton.clicked.connect(win.btn1()) win.pushButton_2.clicked.connect(win.btn2()) win.pushButton_3.clicked.connect(win.btn3()) win.pushButton_4.clicked.connect(win.btn_plus()) win.pushButton_5.clicked.connect(win.btn4()) win.pushButton_6.clicked.connect(win.btn7()) win.pushButton_8.clicked.connect(win.btn5()) win.pushButton_9.clicked.connect(win.btn8()) win.pushButton_10.clicked.connect(win.btn0()) win.pushButton_11.clicked.connect(win.btn6()) win.pushButton_12.clicked.connect(win.btn9()) win.pushButton_13.clicked.connect(win.btnequal()) win.pushButton_14.clicked.connect(win.btn_sub()) win.pushButton_15.clicked.connect(win.btn_mul()) win.pushButton_16.clicked.connect(win.btn_div()) win.show() sys.exit(app.exec_())为什么会报错
05-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值