0

我正在开发一个多段下载管理器。我想显示分割过程。QGraphicsScene 工作正常,但不幸的是它减慢了下载速度。除了使用 QProgressBars 之外,还有没有更好的选择。我正在使用 QNetworkAccessManager 下载文件。如果我将 QNetworkManager 对象的 downloadProgress 信号连接到利用 QGraphicsView 绘制的 Main Gui Thread 的插槽,在某些情况下下载速度甚至会下降 10 倍

    // a custom progress bar
void Download::showGProgress(int num, float prgrss)                                 //slot
{
    prgrss=prgrss/100;
    x_coord=(ui->graphicsView_2->width()-3)*prgrss;                              
    for(float b=0;b<=x_coord;b=b+0.5)
    {
        progress.addRect(0,0,x_coord,y_coord);

    }

}
4

3 回答 3

1

创建自己的小部件来做你想做的事

这比听起来容易。

创建一个从 QWidget 子类化的类。在这个小部件中制作一个包含 100 个 Qlabels 的 Horizo​​ntal Sizer(将 QLabels 存储在一个向量中)。通过将每个 QLabel 的背景颜色设置为不同的颜色,给它插槽以“更新”当前进度。这应该很容易逐步完成,这意味着您将当前的“百分比”存储为成员变量,然后只调整获得所需百分比所需的字段(如果您是每次都从头开始)。

添加将大小调整器切换到垂直大小而不是水平大小的功能,以使其更加可定制。

这使您可以对进度条执行的操作发挥创意,因为每个元素可以是不同的图片、不同的颜色或任何您想要的。

于 2012-08-31T17:45:02.520 回答
1

QNetworkAccessManager没有螺纹。它是异步的,使用当前线程事件循环。它创建的 HTTP 请求是线程方面。

这可以解释为什么您在主线程中所做的任何事情理论上都会减慢下载操作。虽然不一定是底层线程下载本身,而是信号响应时间,可以让您快速获得有关它的反馈。

您可能应该做的是创建自己的 QThread 子类,并QNetworkAccessManager在 run() 方法中创建。QEventLoop然后在线程中创建一个并调用exec()

简而言之,您需要创建自己的 Threaded QNetworkAccessManager。

于 2012-08-31T23:41:45.570 回答
0

你试过 QProgressBar 吗?也许您可以编写它的子类来处理您自己的属性。

于 2012-08-31T17:47:33.220 回答