Qt线程调用问题

发布于 2024-09-26 07:14:49 字数 1939 浏览 0 评论 0原文

请帮我。我对线程概念感到震惊。实际上我的问题:我想在组合框中显示城市列表。我从网络服务获取城市列表。我正在使用线程在 Web 服务调用完成后更新组合框值。

在这里我可以调用网络服务。但我无法得到回复。

我正在使用以下代码。

MainWindow.cpp:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    CGNetwork *cgNetwork = new CGNetwork();
    ui->setupUi(this);

    renderThread = new RenderThread(cgNetwork);
    renderThread->start();

    connect(renderThread,SIGNAL(finished()),this,SLOT(initControls()));
}

void MainWindow::initControls()
{
    CGMainWindowUtility *pointer = CGMainWindowUtility::instance();
    QStringList cityitems;
    cityitems <<tr("All");
    cityitems.append(pointer->getCityList());
    QStringListModel *cityModel = new QStringListModel(cityitems, this);
    ui->cityComboBox->setModel(cityModel);
}

RenderThread.cpp:

RenderThread::RenderThread(CGNetwork *cgnetwork)
{
    cityUrl = "http://112.138.3.181/City/Cities";
    categoryUrl = "http://112.138.3.181/City/Categories";    
}

void RenderThread::run()
{
    qDebug()<< "THREAD Started";
    CGNetwork *cgnetworks = new CGNetwork();
    cgnetworks->getCityList(cityUrl);
}

CGNetwork.cpp:

void CGNetwork ::getCityList(const QUrl url)
{
    cityGuideNetworkAccessManager = new QNetworkAccessManager(this);
    qDebug()<<"connection";

    connect(cityGuideNetworkAccessManager, SIGNAL(finished(QNetworkReply*)),
        this, SLOT(parseCityList()));

    const QNetworkRequest cityRequest(url);
    cityReply= cityGuideNetworkAccessManager->get(cityRequest);

    connect(cityReply, SIGNAL(error(QNetworkReply::NetworkError)),
        this, SLOT(slotError()));
}

void  CGNetwork::parseCityList()
{
    qDebug()<<"Parsing";
    cgParser = new CGJsonParser();
    cgParser->CityRead(cityReply);
}

Please help me. I am struck-up with thread concept. Actually my problem : I want to display the cities List in the combobox. I am getting cities list from the webservice. I am using thread for update the combo box value after webserice call finished.

Here I can call the webservice. But I couldn't get the Reply.

I am using the following code.

MainWindow.cpp:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    CGNetwork *cgNetwork = new CGNetwork();
    ui->setupUi(this);

    renderThread = new RenderThread(cgNetwork);
    renderThread->start();

    connect(renderThread,SIGNAL(finished()),this,SLOT(initControls()));
}

void MainWindow::initControls()
{
    CGMainWindowUtility *pointer = CGMainWindowUtility::instance();
    QStringList cityitems;
    cityitems <<tr("All");
    cityitems.append(pointer->getCityList());
    QStringListModel *cityModel = new QStringListModel(cityitems, this);
    ui->cityComboBox->setModel(cityModel);
}

RenderThread.cpp:

RenderThread::RenderThread(CGNetwork *cgnetwork)
{
    cityUrl = "http://112.138.3.181/City/Cities";
    categoryUrl = "http://112.138.3.181/City/Categories";    
}

void RenderThread::run()
{
    qDebug()<< "THREAD Started";
    CGNetwork *cgnetworks = new CGNetwork();
    cgnetworks->getCityList(cityUrl);
}

CGNetwork.cpp:

void CGNetwork ::getCityList(const QUrl url)
{
    cityGuideNetworkAccessManager = new QNetworkAccessManager(this);
    qDebug()<<"connection";

    connect(cityGuideNetworkAccessManager, SIGNAL(finished(QNetworkReply*)),
        this, SLOT(parseCityList()));

    const QNetworkRequest cityRequest(url);
    cityReply= cityGuideNetworkAccessManager->get(cityRequest);

    connect(cityReply, SIGNAL(error(QNetworkReply::NetworkError)),
        this, SLOT(slotError()));
}

void  CGNetwork::parseCityList()
{
    qDebug()<<"Parsing";
    cgParser = new CGJsonParser();
    cgParser->CityRead(cityReply);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

葬シ愛 2024-10-03 07:14:49

由于 QNetworkAccessManager 异步工作,因此不需要单独的线程。您可以直接从主线程调用 getCityList 并且它不会阻塞。

我认为您的插槽未被调用,因为您的 QThread::run 在其正在执行的任何工作有机会完成之前返回,因为 getCityList 刚刚发起了一个 http 请求无需等待(因为 QNetworkAccessManager::get 不会像我上面所说的那样阻塞)。

另外作为旁注,您的插槽没有获得与其相应信号相同的参数,我不记得 Qt 是否支持这一点。

Since QNetworkAccessManager works asynchronously, there's no need for a separate thread. You can call getCityList directly from your main thread and it won't block.

I think your slots weren't called because your QThread::run returned before any of the work its been doing had a chance to complete, since getCityList just initiated an http request without waiting for it (because QNetworkAccessManager::get doesn't block like I said above).

Also as a side note, your slots aren't getting the same parameters as their corresponding signals, I don't remember if Qt supports this.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文