You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 23:45:13