1

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

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

让我解释一下我的情况。

我有 3 节课:

  1. 类 MainWindow(从类继承QMainWindow并充当主 GUI)
  2. class LogInWidget(继承自QWidgetclass。这个类由所有的用户名/密码字段+一个进度条组成,请看下图)

登录小部件

3.class DataTableWidget(继承自QWidgetclass.consist组成一个显示几十万数据的表)

该程序的设计目的是一旦用户通过 登录该程序LogInWidget,他将能够看到由DataTableWidget.

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

table = DataTableWidget ()
self.setCentralWidget(table)

显示表格。

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

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

我想用Qthread它来完成它,但是由于这两个任务,显示进度条以及创建DataTableWidget和设置为中央小部件都是 GUI 任务,我应该如何处理它?

4

2 回答 2

1

您必须将进度条值连接到来自 DataTableWidget 的信号。但这又假设 DataTableWidget 在渲染时多次生成此信号,这是不可能的。也许您需要的只是一种显示 GUI 忙碌的方法,就像条形图上带有一条在条形图两端之间来回穿梭的线。那么你就不需要在两个小部件之间交换数据了。

于 2014-03-28T06:40:25.127 回答
1

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

DataTableWidget正如@schollii 所说,您需要在渲染时发出信号。这样的信号是不存在的。即使它这样做了,它也不会被处理,直到小部件被渲染

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

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

请注意,这非常 hacky,通常是不好的做法,并且完全破坏了模型视图范式。我不建议这样做。但我无论如何也想不出能达到同样的结果。也许您可以加快DataTableWidget. 例如,QTableView.resizeColumnsToContents()已知速度很慢。你在任何地方都这么叫吗?

于 2014-03-28T11:00:49.533 回答