QSqlQueryModel搭配QTableView使用卡死问题

在项目中发现了QSqlQueryModel搭配QTableView使用卡死的问题,以本文记录下来。

现象

用QSqlQueryModel关联数据库的表格,用QTableView把QSqlQueryModel的数据显示出来。
当表格行数添加到9时,界面会卡死,类似下图的场景。
请添加图片描述
修改数据库,把行数减到8或加到10行,卡死的现象消失。

原因

经过测试,卡死的原因是QTableView的水平滚动条显示机制有bug。
项目中滑动条采用了ScrollBarAsNeeded模式,在该模式下,表格显示不完整时,会显示滑动条,表格显示完整时,会隐藏滑动条。
如果表格高度加上滑动条高度与QTableView的高度相差不大,像上图那样,可能Qt内部会出现了判断错误的情况(目前的推断,后续有空再看源码确认),一下子认为滑动条需要显示,一下子又认为滑动条不需要显示,不停地闪烁,导致界面卡死。

解决方法

1、如果出现这种情况,那就判断表格是否需要水平滚动条,需要就设为ScrollBarAlwaysOn,不需要就设为ScrollBarAlwaysOff,就不存在闪烁的问题了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中的QTableViewQt的一个类,用于显示和编辑表格数据。在许多应用程序中,我们需要从数据库中检索数据并在表格中显示。使用委托(Delegate)可以实现对表格中数据的自定义显示和编辑。 在Python中,可以使用PyQt或PySide库来创建和管理QTableView。要使用数据库,我们可以使用SQLite、MySQL或其他流行的数据库管理系统(DBMS),并使用库中提供的相应模块来与数据库进行通信。 首先,我们需要将数据库数据检索到一个查询结果(QSqlQueryModel)中。然后,创建一个QTableView来显示查询结果。 使用委托可以实现对特定列的数据进行自定义显示和编辑。委托是一个QItemDelegate的子类,可以重写其中的方法来自定义显示和编辑行为。 例如,如果我们想在表格中的某一列显示一个按钮,可以创建一个自定义委托,并在其paint()方法中绘制一个按钮。然后,将该委托设置给要显示按钮的列。同样地,我们可以在委托的editorEvent()方法中处理按钮的点击事件。 另一个常见的使用委托的例子是在表格中显示和编辑日期。可以创建一个自定义委托,在其setEditorData()方法中将日期值转换为字符串,并在setModelData()方法中将字符串值转换回日期值。 使用委托可以实现更多的自定义显示和编辑行为,比如显示进度条、图像等。根据需求,我们可以创建多个委托,并将其设置给不同的列,以实现不同的效果。 总之,Python的QTableView可以通过使用委托实现对数据库数据的自定义显示和编辑。通过重写委托的方法,我们可以实现各种自定义的显示和编辑行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值