Qt - QTableView 中的正常垂直滚动条句柄行为
Posted
技术标签:
【中文标题】Qt - QTableView 中的正常垂直滚动条句柄行为【英文标题】:Qt - Normal vertical scrollbar handle behavior in QTableView 【发布时间】:2014-09-15 05:20:26 【问题描述】:我在 Qt 中使用 QTableView(实际上是 PyQt4)。垂直滚动条的行为非常奇怪,与 QTableWidget 滚动条或任何其他滚动条的行为方式不同。我有一张大桌子,有数千行。垂直滚动条的手柄(可点击/可拖动部分)总是开始时比应有的更大(更高)。当我使用滚轮向下滚动表格到手柄位于滚动条大约 90% 位置的点时(即使我只说通过表格的 30%),手柄突然向上移动说滚动条的 70% 位置并缩小一点。当我遍历表格的其余部分时,句柄会重复这种行为,每次都会变小一点,并且每次句柄到达滚动条底部时都会向上跳回滚动条到大约 70% 的位置。
请注意,这种奇怪的行为仅在我的表格很长(例如至少 500 行)时才会发生。
我很欣赏这是一个有趣的机制并且有些道理,但它必须是可选的。有什么方法可以禁用它并获得在长表中正常运行的滚动条句柄?
我对 QTableView 所做的只是创建它并将其模型设置为使用基本 SQL 查询数据库的 QSqlQueryModel。
【问题讨论】:
它对我来说很好用。你在使用 qt4 设计器还是硬编码?@Pat Flegit 使用 PyQt4 对所有内容进行硬编码。我从 SQL 数据库中获取数据,我的代码与此处最佳答案中给出的代码没有什么不同:***.com/questions/8923562/… 看这个例子它对我来说很好 这是依赖于 QSqlQueryModel 还是发生在任何大型数据集上?如果是这样,你能做一个最小的例子吗?这篇关于tables with large datasets 的文章也很有用。 【参考方案1】:模型只在开始时获取视口所需的数据量。一开始就这样做可以解决它:
model = QSqlQueryModel()
model.setQuery("select some stuff", db)
while model.canFetchMore():
model.fetchMore()
tableView.setModel(model)
【讨论】:
【参考方案2】:这是我的例子,滚动条工作正常
import operator
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MyWindow(QWidget):
def __init__(self, data_list, header, *args):
QWidget.__init__(self, *args)
# setGeometry(x_pos, y_pos, width, height)
self.setGeometry(300, 200, 570, 450)
self.setWindowTitle("Click on column title to sort")
table_model = MyTableModel(self, data_list, header)
table_view = QTableView()
table_view.setModel(table_model)
# set font
font = QFont("Courier New", 14)
table_view.setFont(font)
# set column width to fit contents (set font first!)
table_view.resizeColumnsToContents()
# enable sorting
table_view.setSortingEnabled(True)
layout = QVBoxLayout(self)
layout.addWidget(table_view)
self.setLayout(layout)
class MyTableModel(QAbstractTableModel):
def __init__(self, parent, mylist, header, *args):
QAbstractTableModel.__init__(self, parent, *args)
self.mylist = mylist
self.header = header
def rowCount(self, parent):
return len(self.mylist)
def columnCount(self, parent):
return len(self.mylist[0])
def data(self, index, role):
if not index.isValid():
return None
elif role != Qt.DisplayRole:
return None
return self.mylist[index.row()][index.column()]
def headerData(self, col, orientation, role):
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return self.header[col]
return None
def sort(self, col, order):
"""sort table by given column number col"""
self.emit(SIGNAL("layoutAboutToBeChanged()"))
self.mylist = sorted(self.mylist,
key=operator.itemgetter(col))
if order == Qt.DescendingOrder:
self.mylist.reverse()
self.emit(SIGNAL("layoutChanged()"))
# the solvent data ...
header = ['Solvent Name', ' BP (deg C)', ' MP (deg C)', ' Density (g/ml)']
# use numbers for numeric data to sort properly
data_list = [
('ACETIC ACID', 117.9, 16.7, 1.049),
('ACETIC ANHYDRIDE', 140.1, -73.1, 1.087),
('ACETONE', 56.3, -94.7, 0.791),
('ACETONITRILE', 81.6, -43.8, 0.786),
('ANISOLE', 154.2, -37.0, 0.995),
('BENZYL ALCOHOL', 205.4, -15.3, 1.045),
('BENZYL BENZOATE', 323.5, 19.4, 1.112),
('BUTYL ALCOHOL NORMAL', 117.7, -88.6, 0.81),
('BUTYL ALCOHOL SEC', 99.6, -114.7, 0.805),
('BUTYL ALCOHOL TERTIARY', 82.2, 25.5, 0.786),
('CHLOROBENZENE', 131.7, -45.6, 1.111),
('CYCLOHEXANE', 80.7, 6.6, 0.779),
('CYCLOHEXANOL', 161.1, 25.1, 0.971),
('CYCLOHEXANONE', 155.2, -47.0, 0.947),
('DICHLOROETHANE 1 2', 83.5, -35.7, 1.246),
('DICHLOROMETHANE', 39.8, -95.1, 1.325),
('DIETHYL ETHER', 34.5, -116.2, 0.715),
('DIMETHYLACETAMIDE', 166.1, -20.0, 0.937),
('DIMETHYLFORMAMIDE', 153.3, -60.4, 0.944),
('DIMETHYLSULFOXIDE', 189.4, 18.5, 1.102),
('DIOXANE 1 4', 101.3, 11.8, 1.034),
('DIPHENYL ETHER', 258.3, 26.9, 1.066),
('ETHYL ACETATE', 77.1, -83.9, 0.902),
('ETHYL ALCOHOL', 78.3, -114.1, 0.789),
('ETHYL DIGLYME', 188.2, -45.0, 0.906),
('ETHYLENE CARBONATE', 248.3, 36.4, 1.321),
('ETHYLENE GLYCOL', 197.3, -13.2, 1.114),
('FORMIC ACID', 100.6, 8.3, 1.22),
('HEPTANE', 98.4, -90.6, 0.684),
('HEXAMETHYL PHOSPHORAMIDE', 233.2, 7.2, 1.027),
('HEXANE', 68.7, -95.3, 0.659),
('ISO OCTANE', 99.2, -107.4, 0.692),
('ISOPROPYL ACETATE', 88.6, -73.4, 0.872),
('ISOPROPYL ALCOHOL', 82.3, -88.0, 0.785),
('METHYL ALCOHOL', 64.7, -97.7, 0.791),
('METHYL ETHYLKETONE', 79.6, -86.7, 0.805),
('METHYL ISOBUTYL KETONE', 116.5, -84.0, 0.798),
('METHYL T-BUTYL ETHER', 55.5, -10.0, 0.74),
('METHYLPYRROLIDINONE N', 203.2, -23.5, 1.027),
('MORPHOLINE', 128.9, -3.1, 1.0),
('NITROBENZENE', 210.8, 5.7, 1.208),
('NITROMETHANE', 101.2, -28.5, 1.131),
('PENTANE', 36.1, ' -129.7', 0.626),
('PHENOL', 181.8, 40.9, 1.066),
('PROPANENITRILE', 97.1, -92.8, 0.782),
('PROPIONIC ACID', 141.1, -20.7, 0.993),
('PROPIONITRILE', 97.4, -92.8, 0.782),
('PROPYLENE GLYCOL', 187.6, -60.1, 1.04),
('PYRIDINE', 115.4, -41.6, 0.978),
('SULFOLANE', 287.3, 28.5, 1.262),
('TETRAHYDROFURAN', 66.2, -108.5, 0.887),
('TOLUENE', 110.6, -94.9, 0.867),
('TRIETHYL PHOSPHATE', 215.4, -56.4, 1.072),
('TRIETHYLAMINE', 89.5, -114.7, 0.726),
('TRIFLUOROACETIC ACID', 71.8, -15.3, 1.489),
('WATER', 100.0, 0.0, 1.0),
('XYLENES', 139.1, -47.8, 0.86)
]
app = QApplication([])
win = MyWindow(data_list, header)
win.show()
app.exec_()
【讨论】:
这对我来说也很好。事实证明,当我只有几十个结果时,我的原始查询也是如此。当我说 500 行时,出现了替代行为。我用此信息更新了原始帖子。以上是关于Qt - QTableView 中的正常垂直滚动条句柄行为的主要内容,如果未能解决你的问题,请参考以下文章