Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Qt-QTableView中的正常垂直滚动条句柄行为_Python_Qt_Pyqt_Pyqt4_Pyside - Fatal编程技术网

Python Qt-QTableView中的正常垂直滚动条句柄行为

Python Qt-QTableView中的正常垂直滚动条句柄行为,python,qt,pyqt,pyqt4,pyside,Python,Qt,Pyqt,Pyqt4,Pyside,实际上,我在Qt PyQt4中使用了QTableView。垂直滚动条的行为非常奇怪,与QTableWidget滚动条或任何其他滚动条的行为不同。我有一张大桌子,有几千行。垂直滚动条的可点击/拖动部分的手柄开始时总是比应该的高。当我使用滚轮向下滚动表格,直到手柄位于滚动条90%左右的位置时,即使我只在表格中滚动了30%,手柄突然向上移动到滚动条70%的位置,并且尺寸缩小了一点。当我遍历表的其余部分时,句柄重复此行为,每次都变小一点,每次句柄到达滚动条底部时,都会跳回到滚动条上约70%的位置 请注意

实际上,我在Qt PyQt4中使用了QTableView。垂直滚动条的行为非常奇怪,与QTableWidget滚动条或任何其他滚动条的行为不同。我有一张大桌子,有几千行。垂直滚动条的可点击/拖动部分的手柄开始时总是比应该的高。当我使用滚轮向下滚动表格,直到手柄位于滚动条90%左右的位置时,即使我只在表格中滚动了30%,手柄突然向上移动到滚动条70%的位置,并且尺寸缩小了一点。当我遍历表的其余部分时,句柄重复此行为,每次都变小一点,每次句柄到达滚动条底部时,都会跳回到滚动条上约70%的位置

请注意,只有当我的表相当长(比如至少500行)时,才会发生这种奇怪的行为

我理解这是一个有趣的机制,有一定的道理,但它必须是可选的。有没有办法禁用它并获得一个在长表中正常运行的滚动条句柄


我对QTableView所做的一切就是创建它,并将其模型设置为QSqlQueryModel,该模型使用对数据库的基本SQL查询。

这就是我的示例,滚动条工作正常

 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_()

模型仅在开始时获取视口所需的数据量。在开始时这样做可以修复它:

model = QSqlQueryModel()
model.setQuery("select some stuff", db)
while model.canFetchMore():
    model.fetchMore()
tableView.setModel(model)

这对我来说很好。您使用的是qt4设计器还是硬编码???@Pat Flegit使用PyQt4硬编码所有内容。我从一个SQL数据库获取数据,我的代码与上面的答案没有什么不同:看到这个例子了吗?它适用于依赖于QSqlQueryModel的MEI,还是适用于任何大型数据集?如果是的话,你能举个简单的例子吗。这篇文章也很有用。这对我来说也很好。事实证明,当我只有几十个结果时,我的原始查询也是如此。当我说500行时,另一种行为出现了。我用这些信息更新了原来的帖子。