Qt Widget类比特币价格获取问题:按钮点击无法更新价格
Qt比特币价格获取问题
初始化Widget类时能正常从API获取比特币价格,但点击按钮无法更新价格。尝试将获取代码移至on_pushButton_pressed槽函数后完全无效,无法正确获取或更新价格。需要实现按钮点击时更新比特币价格的功能,求代码修改方案。
原代码片段
#include "widget.h" #include "./ui_widget.h" #include <QNetworkAccessManager> #include <QNetworkReply> #include <QJsonDocument> #include <QJsonObject> #include <QDebug> Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); QNetworkAccessManager manager; QNetworkReply *reply = manager.get(QNetworkRequest(QUrl("https://api.coindesk.com/v1/bpi/currentprice/BTC.json"))); connect(reply, &QNetworkReply::finished, [this, reply]() { if (reply->error() == QNetworkReply::NoError) { QByteArray data = reply->readAll(); QJsonDocument jsonDoc = QJsonDocument::fromJson(data); QJsonObject jsonObj = jsonDoc.object(); QJsonObject bpiObj = jsonObj["bpi"].toObject(); QJsonObject usdObj = bpiObj["USD"].toObject(); double bitcoinValue = usdObj["rate_float"].toDouble(); // Przypisz wartość bitcoina do zmiennej w klasie Widget this->bitcoinValue_ = bitcoinValue; // Możesz tutaj umieścić kod, który używa wartości bitcoina } else { qDebug() << "Error occurred while fetching Bitcoin value: " << reply->errorString(); } reply->deleteLater(); }); } Widget::~Widget() { delete ui; } void Widget::on_pushButton_pressed() { ui->label->setText(QString::number(this->bitcoinValue_) + "$"); } void Widget::on_pushButton_released() { ui->label->setText(""); }
问题根源
QNetworkAccessManager生命周期过短:局部创建的QNetworkAccessManager对象会在函数执行结束后销毁,导致网络请求无法正常完成。- 按钮逻辑不符合需求:原
pressed槽仅显示旧值,未触发新请求;released清空标签的逻辑与“点击更新价格”的目标冲突。
代码修改方案
1. 更新widget.h添加成员变量和槽函数
#include <QWidget> #include <QNetworkAccessManager> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); private slots: void on_pushButton_clicked(); void handleNetworkReply(QNetworkReply* reply); private: Ui::Widget *ui; double bitcoinValue_ = 0.0; QNetworkAccessManager *networkManager; void fetchBitcoinPrice(); // 封装价格获取逻辑 };
2. 修改widget.cpp实现完整逻辑
#include "widget.h" #include "./ui_widget.h" #include <QNetworkReply> #include <QJsonDocument> #include <QJsonObject> #include <QDebug> Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); // 初始化网络管理器,父对象为Widget,自动管理内存 networkManager = new QNetworkAccessManager(this); connect(networkManager, &QNetworkAccessManager::finished, this, &Widget::handleNetworkReply); // 初始化时先获取一次价格 fetchBitcoinPrice(); } Widget::~Widget() { delete ui; } // 封装获取比特币价格的逻辑 void Widget::fetchBitcoinPrice() { QUrl apiUrl("https://api.coindesk.com/v1/bpi/currentprice/BTC.json"); networkManager->get(QNetworkRequest(apiUrl)); } // 处理网络请求响应 void Widget::handleNetworkReply(QNetworkReply* reply) { if (reply->error() == QNetworkReply::NoError) { QByteArray responseData = reply->readAll(); QJsonDocument jsonDoc = QJsonDocument::fromJson(responseData); if (!jsonDoc.isNull()) { QJsonObject rootObj = jsonDoc.object(); QJsonObject bpiObj = rootObj["bpi"].toObject(); QJsonObject usdObj = bpiObj["USD"].toObject(); bitcoinValue_ = usdObj["rate_float"].toDouble(); // 更新标签显示最新价格,保留两位小数 ui->label->setText(QString::number(bitcoinValue_, 'f', 2) + "$"); } else { qDebug() << "解析JSON失败"; ui->label->setText("解析失败"); } } else { qDebug() << "获取价格错误:" << reply->errorString(); ui->label->setText("获取失败"); } reply->deleteLater(); } // 按钮点击触发价格更新 void Widget::on_pushButton_clicked() { fetchBitcoinPrice(); }
3. 调整UI按钮信号连接
在Qt Designer中,将按钮的clicked()信号连接到on_pushButton_clicked()槽函数,同时删除原有的pressed和released信号连接。
内容的提问来源于stack exchange,提问作者veltronic
相关产品推荐
相关产品推荐

