如何在Qt中创建自定义多进度栏

时间:2012-08-31 17:35:12

标签: qt

我正在开发一个多段下载管理器。我想显示细分程序。 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);

    }

}

3 个答案:

答案 0 :(得分:1)

创建自己的小部件以执行您想要的操作

这比听起来容易。

创建一个来自QWidget的子类。在这个小部件中,创建一个包含100个Qlabels的水平Sizer(将QLabel存储在向量中)。给它插槽以更新&#39;通过将每个QLabel的背景颜色设置为不同的颜色来进行当前进度。这应该是相当容易逐步进行的,这意味着你存储当前的百分比&#39;作为成员变量,然后只调整所需的字段以达到您要查找的百分比(如果您每次都从头开始,这将消除一些闪烁)。

添加将sizer切换为垂直分割器而不是水平分割器的功能,以使其更具可定制性。

这使您可以在进度条的功能上获得创意,因为每个元素可能是不同的图片,或者是不同的颜色,或者您想要的任何颜色。

答案 1 :(得分:1)

QNetworkAccessManager没有线程化。它是异步的,使用当前线程eventloop。它创建的HTTP请求是线程方面。

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

您应该做的是创建自己的QThread子类,并在run()方法中创建QNetworkAccessManager。然后在主题中创建QEventLoop并调用exec()

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

答案 2 :(得分:0)

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