我发现了几个与此类似的问题,例如:
但大多数示例和答案都在1个GUI线程和1个数据处理线程上。
让我解释一下我的情景。
我有3个班级:
QMainWindow
类并充当主GUI)QWidget
class。此类包含所有用户名/密码字段+进度条,请参阅下图)
3.class DataTableWidget(继承自显示数十万数据的表的QWidget
class.consist)
该程序的设计是为了一旦用户通过LogInWidget
登录该程序,他就能够看到DataTableWidget
显示的所有数据。
我使用.setCentralWidget
方法同时设置LogInWidget
和DataTableWidget
。(即如果用户密码正确,我使用
table = DataTableWidget ()
self.setCentralWidget(table)
显示表格。
我的问题是:当用户登录时,在他可以看到数据表之前有一个很大的GUI冻结,因为通过该表显示了很多数据输入。
所以我想在程序加载表格之前显示一个繁忙的进度条(在我的LogInWidget
上)。
我想过使用Qthread
来完成它,但由于这两项任务,显示进度条和创建DataTableWidget
以及设置为centralwidget都是GUI任务,我应该如何处理它?</ p>
答案 0 :(得分:1)
您必须将进度条值连接到DataTableWidget中的信号。但这反过来假设DataTableWidget在渲染时多次生成此信号,这是不可能的。也许您需要的只是一种方式来显示GUI正忙,就像条形图上的条形图一样,它在条形图的两端之间来回传递。然后,您不需要在两个小部件之间交换数据。
答案 1 :(得分:1)
没有直接的方法来做到这一点。但是,这是一个想法:
正如@schollii所说,你需要在DataTableWidget
渲染时发出信号。这样的信号不存在。即使它确实如此,在窗口小部件呈现之前也不会处理它
但是,如果DataTableWidget
有模型,您可以使用自己的方法覆盖data()
方法,只调用基类的data()
方法并更新进度条(尽管仅在首次呈现表时更新进度条,而不是在后续调用data()
时)。在视图呈现时,视图将多次调用data()
方法。这样,您可以在渲染过程中访问时间点。
当然,在控件返回到事件循环(渲染完成)之前,进度条不会重绘,但您可以通过调用QApplication.processEvents()
来解决这个问题。
请注意,这通常是一种不好的做法,并且完全破坏了模型 - 视图范例。我不建议这样做。但我无论如何都无法想到达到同样的结果。也许你可以加快DataTableWidget
的渲染速度。例如,QTableView.resizeColumnsToContents()
已知很慢。你在哪儿打电话吗?