QProgressbar和QNetworkReply发出信号

时间:2010-01-16 12:23:36

标签: c++ qt networking qt4

我正在使用Qt Framework用C ++编写应用程序。 它应该通过http下载一个文件,并用QProgressbar显示下载进度 - 但我没有得到这部分工作!

示例代码:

QProgressBar* pbar = new QProgressBar();
//calls the website and returns the QNetworkReply*
QNetworkReply* downloader = Downloader->getFile(); 

connect(downloader, SIGNAL(downloadProgress(qint64,qint64)), pbar, SLOT(setValue(int)));

如果我运行我的代码,则会发生以下错误:

QObject::connect: Incompatible sender/receiver arguments
QNetworkReplyImpl::downloadProgress(qint64,qint64) --> QProgressBar::setValue(int)

但是the Qt docs for QNetworkReply说:

  

此信号适合连接到QProgressBar :: setValue()以更新提供用户反馈的QProgressBar。

我的代码有什么问题,如何让它运行? 我在Linux下运行Qt 4.5.3。

感谢您的帮助,对不起我的英语!

2 个答案:

答案 0 :(得分:5)

是的,它是正确的,您必须在SIGNAL / SLOT方法中设置匹配的参数...无论如何,在Qt示例和演示中,您可以在例如“FTP客户端”中找到以下代码:

connect(ftp, SIGNAL(dataTransferProgress(qint64, qint64)), this, SLOT(updateDataTransferProgress(qint64, qint64)));

...

void FtpWindow::updateDataTransferProgress(qint64 readBytes, qint64 totalBytes)
{
    progressDialog->setMaximum(totalBytes);
    progressDialog->setValue(readBytes);
}

您可以复制该部分并以这种方式更新进度条......

我建议:

connect(downloader, SIGNAL(downloadProgress(qint64,qint64)), pbar, SLOT(updateDataTransferProgress(qint64,qint64)));

我希望它可以帮到你!

更多信息:http://qt.nokia.com/doc/4.6/network-qftp.html

答案 1 :(得分:0)

我引用文档:

  

特殊情况下,如果信号有更多   它比槽的参数   连接,附加   简单地忽略参数:

connect(ftp,
SIGNAL(rawCommandReply(int, const
QString &)),
        this, SLOT(checkErrorCode(int)));

在你的情况下,问题实际上是参数类型与qint64!= int不匹配,如果没有包装器或类型转换,就不可能完成任务。