使用 QNetworkAccessManager 發送 GET 請求,斷點設置在 replyFinished 槽函數入口,但程式運行時從未觸發,網路請求似乎發送成功但無回調。
class MainWindow : public QMainWindow {
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
void replyFinished(QNetworkReply*); // 缺少 slots 聲明!
private:
Ui::MainWindow *ui;
QNetworkAccessManager *manager;
};
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) {
ui->setupUi(this);
QUrl url("https://www.weather.com.cn/adat/sk/101010100.html");
manager = new QNetworkAccessManager(this);
QNetworkRequest request;
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
request.setUrl(url);
manager->get(request);
connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
}
void MainWindow::replyFinished(QNetworkReply *reply) {
QTextCodec *codec = QTextCodec::codecForName("utf8");
QString all = codec->toUnicode(reply->readAll());
ui->textBrowser->setText(all);
reply->deleteLater();
}
槽函數未在類別中聲明為 slots。Qt 的信號/槽機制依賴 MOC (Meta-Object Compiler) 生成元資料,只有標記為 public slots:、private slots: 或 protected slots: 的成員函數才會被 MOC 識別為可連接的槽。
class MainWindow : public QMainWindow {
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots: // 關鍵修復:添加 slots 聲明
void replyFinished(QNetworkReply*);
private:
Ui::MainWindow *ui;
QNetworkAccessManager *manager;
};
// 替代舊式 SIGNAL/SLOT 宏
connect(manager, &QNetworkAccessManager::finished, this, &MainWindow::replyFinished);
// 或使用 Lambda
connect(manager, &QNetworkAccessManager::finished, this, [this](QNetworkReply* reply) {
// 處理邏輯
reply->deleteLater();
});
Q_OBJECT 宏QNetworkReply*)manager 物件生命週期覆蓋請求期間(設為成員變數或 parent=this)QApplication::exec())<uses-permission android:name="android.permission.INTERNET"/>ignoreSslErrors())QT_DEBUG_PLUGINS=1 或 QNetworkAccessManager::setNetworkAccessible()errorOccurred 信號捕獲錯誤:connect(reply, &QNetworkReply::errorOccurred, [](QNetworkReply::NetworkError err){ qDebug() << err; });Qt 信號/槽連接失效 90% 由以下原因導致:缺少 Q_OBJECT、槽未聲明 slots、參數不匹配、物件已銷毀。養成使用新式連接語法習慣,可在編譯期發現多數問題。