- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有QTableView
,我想通过添加空行来填充它的底部空间:
QTableView
中没有数据,最后这个必须填n空行 n = QTableView.height()/QTableView.rowHeight()
QTableView
)有 m
行底部有空白,我们必须添加 n
空行行到 QTableView
,n = (QTableView.height()/QTableView.rowHeight()) - m
我真正的问题是,在调整 QTableView
大小时,我们必须以 TableView 必须保持填充的方式添加/删除空行(当没有 ScrollBar
时)
我正在寻找一种方法来更新 QTableView
项目,因为它的尺寸发生变化。
注意:
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]
最佳答案
嗯,在我看来,我找到了一个可以接受的答案,我希望它是好的,但肯定有更好的答案。
不过,我确实使用了上面的相同代码以及一些核心更改。
注意:
Return
或 Delete
按钮来测试添加或删除行。主类
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 setScrollBarVisibility(self, emptyRowCount):
if emptyRowCount > 0:
self.tableView.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
else:
self.tableView.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
def eventFilter(self, source, event):
if event.type() == QEvent.Resize and source is self.tableView:
totalRowNumber = (self.tableView.height()) / DEFAULT_ROW_HEIGHT
self.model.updateRows(floor(totalRowNumber))
self.setScrollBarVisibility(self.model.emptyRowCount())
if event.type() == QEvent.KeyPress:
if event.key() == QtCore.Qt.Key_Return:
self.model.addRow()
self.setScrollBarVisibility(self.model.emptyRowCount())
elif event.key() == QtCore.Qt.Key_Delete:
self.model.delRow()
self.setScrollBarVisibility(self.model.emptyRowCount())
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
self.__total_row_count = 0 # Max visible rows.
def updateRows(self, n):
self.__total_row_count = n
if n > self.tasksCount(): # If the view has an empty space.
self.__empty_row_count = n - self.tasksCount()
else:
self.__empty_row_count = 0
self.reset() # Reset the view, results to call rowCount method.
def emptyRowCount(self):
return self.__empty_row_count
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
# Data rows + empty rows.
def columnCount(self, parent=None, *args, **kwargs):
return len(self.__header) + 1
# headers + the last stretched column
def flags(self, index):
row = index.row()
if row >= self.tasksCount(): # If it's an empty row.
return QtCore.Qt.ItemIsEnabled # Non selectable.
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]
def addRow(self):
success = self.__tasks.append(['Task x', 141546123, 80])
if self.__empty_row_count > 0:
self.__empty_row_count -= 1
self.reset() # Update the view.
return success
def delRow(self):
if self.__tasks:
self.__tasks = self.__tasks[:-1]
if self.__empty_row_count == 0: # If the visible view was full before the deleting.
if self.__total_row_count - self.tasksCount() == 1: # If the view didn't remain full.
self.__empty_row_count += 1
else:
self.__empty_row_count += 1
self.reset() # Update the view.
return True
关于python - 用空行填充QtableView的底部空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35130694/
运行 Tomcat 失败并出现 java.lang.OutOfMemoryError - 与缺少 PermGen 空间相关的错误。 我最近将 Tomcat 更改为以自己的用户(而非 root)运行。
我们有一个表,其中包含数百万行,其中包含 PostGIS 几何图形。我们要执行的查询是:落在边界几何内的最新条目是什么?这个查询的问题是我们经常会有大量的项目匹配边界框(半径大约为 5 公里),然后
我有一个Elasticsearch设置,它将允许用户搜索通配符作为索引。 array:3 [ "index" => "users" "type" => "user" "body" => arra
我创建了一个表,其中每行包含两个按钮,并且两个按钮连接在一起,我想将两个按钮分开。我用过 不起作用,css 也是,这是他们的另一种方式。 我有另一个问题,因为我不想在表格边框内显示操作按钮,而是在靠近
我试图在 jQuery Mobile 中的两个按钮之间留出空白。现实中的布局是这样的: Button 1 Button 2 (Hidden w/ display: none)
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
您好,我对图表应用程序还很陌生。现在我为我的应用程序创建了条形图。当我运行 create bar chart as separate project 时,输出如下所示。 然后当我将条形图与我的应用程序
我在使用 H2 和 GeoDB(内存中,junit)时遇到问题。 另外,使用 Hibernate 5(每个包的最新版本,包括 hibernate-spatial)和 Spring 4。 通过 id 实
我想画一张澳大利亚的 map ,并将每个城市表示为一个点。 然后突出显示人口众多(> 1M)的城市 library(sp) library(maps) data(canada.cities) head
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 提供事实和引用来回答它. 6年前关闭。 Improve this
如何保持.txt文件中存在的空格?在.txt文件中,它表示: text :text text1 :text1 text23 :text2 text345 :text3 如果我写这段
以下哪个键最大? 选项 1:16 个数字 [0,9] 选项 2:30 个元音 选项 3:字母表中的 16 个字母 选项 4:32 位 有人可以帮助我,告诉我哪一个是正确的答案以及我们如何计算它吗?我知
在 Unity 3d 中使用 Azure 空间 anchor 来实现在 iOS 和 Android 上部署的室内和室外增强现实体验是否有益? 最佳答案 是的,对于 Azure Spatial Anch
我有一个绝对定位的圆形图像。图像只需占据屏幕宽度的 17%,并且距离顶部 5 个像素。 问题是,当我调整图像大小以占据屏幕宽度的 17% 时,它会这样做,但同时容器会变长。图像本身不会拉伸(stret
我在 Ubuntu 14.04 上使用 Cassandra。从文档中,我可以看到运行命令: nodetool snapshot 创建我的 key 空间的快照。 命令的输出是: nodetool sn
Heroku引入了“私有(private)空间”,是否可以将现有应用迁移到私有(private)空间? https://blog.heroku.com/archives/2015/9/10/herok
是否允许在语义记录中使用非绑定(bind)空格 或其他 HTML 编码字符?我遇到的问题是 ; 字符被软件视为记录的结尾。 例如:假设我有一份婚姻记录,其中包含 2 个结婚者的姓氏、结婚年份以及结
我正在研究“智能 parking ”项目,偶然发现了包含我们真正需要的YouTube视频。我们已经实现了第一部分,即从视频源进行实时透视变换,下一步是将其定义为一组矩形 我基本上需要知道他是如何做到的
我有两个类:Engine 和 Trainset(多个单元),这两个类共享其 ID 空间,其中包含名称和系列 id=- . 这是我的Engine类(它是抽象的,因为有引擎的子类型(DieselEngin
如果有人能帮助我,那就太好了。 我正在尝试使用Java的Split命令,使用空格分割字符串,但问题是,字符串可能没有空格,这意味着它将只是一个简单的顺序(而不是“输入2”将是“退出”) Scanner
我是一名优秀的程序员,十分优秀!