我有 QTableView
,我想通过添加空行填充其底部空间:
-
如果
QTableView
中没有数据,则最后一个必须用n = QTableView.height() / QTableView.rowHeight()
填充n个空行 -
如果
m
在底部(QTableView
)填充了空行空间,我们必须将n
空行添加到QTableView
,并使用n = (QTableView.height() / QTableView.rowHeight()) - m
-
否则就没事了
我真正的问题是,在调整 QTableView
的大小时,我们必须以TableView必须保持填充的方式添加/删除空行(而没有 ScrollBar
)
我正在寻找一种更新 QTableView
项目的方法,因为它的尺寸发生了变化 .
Note:
-
当存在
ScrollBar
时,无需添加任何空行 . -
我在计算空行数时确实计算了
QHeader
的高度 . -
您无法获得
QTableView
的当前高度,因为QTableView.height()
将不会返回确切的高度除非您在QTableView显示后调用它
我真的偶然发现了这个问题,我没有找到任何解决方案,我有一些想法,但它们似乎并不实用 .
更新:
到目前为止,我已经设法在我的代码中取得了很好的进步,但仍然不是我想要的 .
最大的问题是,在添加或删除行时,我不知道应该考虑采用什么方法来执行此操作 .
这是我的问题的示例代码 .
主要课程:
import sys
from math import floor
from PyQt4 import QtGui, QtCore
from PyQt4.QtCore import QEvent
from PyQt4.QtGui import QTableView, QAbstractItemView
from modeltest import TestModel
DEFAULT_ROW_HEIGHT = 30
class App(QtGui.QApplication):
"""Main application class"""
def __init__(self, sys_argv):
"""Constructor for App"""
super(App, self).__init__(sys_argv)
self.tableView = QTableView()
self.tableView.resize(500, 400)
self.tableView.setAttribute(QtCore.Qt.WA_DeleteOnClose) # Fix QObject::startTimer error message.
self.tableView.horizontalHeader().setStretchLastSection(True)
self.tableView.setAlternatingRowColors(True)
self.tableView.setSelectionBehavior(QAbstractItemView.SelectRows)
self.tableView.setSelectionMode(QAbstractItemView.ExtendedSelection)
self.tableView.installEventFilter(self)
self.model = TestModel()
self.tableView.setModel(self.model)
self.tableView.show()
def eventFilter(self, source, event):
if event.type() == QEvent.Resize and source is self.tableView:
totalRowsNumber = (self.tableView.height() - 31) / DEFAULT_ROW_HEIGHT
if totalRowsNumber > self.model.tasksCount():
emptyRowsToAdd = totalRowsNumber - self.model.tasksCount()
else:
emptyRowsToAdd = 0
self.model.emptyRowCount = floor(emptyRowsToAdd)
return QtGui.QWidget.eventFilter(self, source, event)
if __name__ == '__main__':
app = App(sys.argv)
sys.exit(app.exec_())
型号类:
from PyQt4 import QtCore
class TestModel(QtCore.QAbstractTableModel):
"""The model associated with tasks table view"""
def __init__(self, parent=None):
"""Constructor for TestModel"""
super(TestModel, self).__init__(parent)
self.__tasks = [['Task 1', 141546123, 80],
['Task 2', 141546123, 80],
['Task 3', 141546123, 80],
['Task 4', 141546123, 80],
['Task 5', 141546123, 80]]
# self.__tasks = [[]]
self.__header = ['Task', 'Timestamp', 'Status']
self.__empty_row_count = 0
@property
def emptyRowCount(self):
return self.__empty_row_count
@emptyRowCount.setter
def emptyRowCount(self, n):
self.reset() # reset model data.
self.__empty_row_count = n
def tasksCount(self):
if len(self.__tasks) == 1 and self.__tasks[0] == []:
return 0
return len(self.__tasks)
def rowCount(self, parent=None, *args, **kwargs):
return self.tasksCount() + self.__empty_row_count
def columnCount(self, parent=None, *args, **kwargs):
return len(self.__header) + 1
def flags(self, index):
row = index.row()
if row >= self.tasksCount():
return QtCore.Qt.ItemIsEnabled
return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable
def data(self, index, role=QtCore.Qt.DisplayRole):
row = index.row()
column = index.column()
if row < self.tasksCount() and column < len(self.__header):
if role == QtCore.Qt.DisplayRole:
return self.__tasks[row][column]
def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole):
if role == QtCore.Qt.DisplayRole:
if orientation == QtCore.Qt.Horizontal:
if section < len(self.__header):
return self.__header[section]
1 回答
好吧,在我看来,我找到了一个可以接受的答案,我希望它很好,但肯定有一个更好的答案 .
不过,我确实使用了上面相同的代码以及一些核心更改 .
Note:
Return
或Delete
按钮测试添加或删除行 .主要课程
模型类