Python PyQt进度条忙

时间:2014-03-27 15:33:39

标签: python multithreading python-2.7 pyqt qprogressbar

我发现了几个与此类似的问题,例如:

但大多数示例和答案都在1个GUI线程和1个数据处理线程上。

让我解释一下我的情景。

我有3个班级:

  1. 类MainWindow(继承自QMainWindow类并充当主GUI)
  2. class LogInWidget(继承自QWidget class。此类包含所有用户名/密码字段+进度条,请参阅下图)
  3. LogInWidget

    3.class DataTableWidget(继承自显示数十万数据的表的QWidget class.consist)

    该程序的设计是为了一旦用户通过LogInWidget登录该程序,他就能够看到DataTableWidget显示的所有数据。

    我使用.setCentralWidget方法同时设置LogInWidgetDataTableWidget。(即如果用户密码正确,我使用

    table = DataTableWidget ()
    self.setCentralWidget(table)
    

    显示表格。

    我的问题是:当用户登录时,在他可以看到数据表之前有一个很大的GUI冻结,因为通过该表显示了很多数据输入。

    所以我想在程序加载表格之前显示一个繁忙的进度条(在我的LogInWidget上)。

    我想过使用Qthread来完成它,但由于这两项任务,显示进度条和创建DataTableWidget以及设置为centralwidget都是GUI任务,我应该如何处理它?<​​/ p>

2 个答案:

答案 0 :(得分:1)

您必须将进度条值连接到DataTableWidget中的信号。但这反过来假设DataTableWidget在渲染时多次生成此信号,这是不可能的。也许您需要的只是一种方式来显示GUI正忙,就像条形图上的条形图一样,它在条形图的两端之间来回传递。然后,您不需要在两个小部件之间交换数据。

答案 1 :(得分:1)

没有直接的方法来做到这一点。但是,这是一个想法:

正如@schollii所说,你需要在DataTableWidget渲染时发出信号。这样的信号不存在。即使它确实如此,在窗口小部件呈现之前也不会处理它

但是,如果DataTableWidget有模型,您可以使用自己的方法覆盖data()方法,只调用基类的data()方法并更新进度条(尽管仅在首次呈现表时更新进度条,而不是在后续调用data()时)。在视图呈现时,视图将多次调用data()方法。这样,您可以在渲染过程中访问时间点。

当然,在控件返回到事件循环(渲染完成)之前,进度条不会重绘,但您可以通过调用QApplication.processEvents()来解决这个问题。

请注意,这通常是一种不好的做法,并且完全破坏了模型 - 视图范例。我不建议这样做。但我无论如何都无法想到达到同样的结果。也许你可以加快DataTableWidget的渲染速度。例如,QTableView.resizeColumnsToContents()已知很慢。你在哪儿打电话吗?