我需要减小第一列(带有垂直标题的列)的大小
如何在PyQt4中调整QTableView的垂直标题?
我有非常大的标题和小的GUI块来显示这个表,所以,请帮助我!
我可以调整所有列的大小,但无法确定调整垂直标题的大小?
我尝试过很多东西:
self.tableView.setColumnWidth(0, 30) // only able to change the data columns in table not headers
self.tableView.verticalHeader().setResizeMode(QHeaderView.Interactive) //Able to change the height of headers but not width of them
我想制作可由用户调整大小的标题,并且不依赖于项目的任何其他参数,例如窗口大小,其他列的大小......
有人可以帮我这个吗?
答案 0 :(得分:4)
您可以使用setMaximWidth限制垂直标题的大小,并使用setTextElideMode调整文字的裁剪方式。
但是,没有内置方法可以使用户调整垂直标题宽度。因此,作为解决方法,您可以使用resize-event将垂直标题的宽度调整为总宽度的百分比。这样,调整窗口大小也会改变垂直标题的宽度。
这是一个实现所有这些的演示脚本:
import sys
from PyQt4 import QtCore, QtGui
class Window(QtGui.QWidget):
def __init__(self, rows, columns):
super(Window, self).__init__()
self.table = QtGui.QTableView(self)
self.table.installEventFilter(self)
self.table.verticalHeader().setTextElideMode(QtCore.Qt.ElideRight)
model = QtGui.QStandardItemModel(rows, columns, self.table)
for row in range(rows):
item = QtGui.QStandardItem('FOO_BAR_123_AB_CD_%s' % row)
model.setVerticalHeaderItem(row, item)
for column in range(columns):
item = QtGui.QStandardItem('(%d, %d)' % (row, column))
item.setTextAlignment(QtCore.Qt.AlignCenter)
model.setItem(row, column, item)
self.table.setModel(model)
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.table)
def eventFilter(self, source, event):
if event.type() == QtCore.QEvent.Resize and source is self.table:
source.verticalHeader().setMaximumWidth(source.width() / 4)
return super(Window, self).eventFilter(source, event)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
window = Window(15, 5)
window.setGeometry(600, 100, 400, 300)
window.show()
sys.exit(app.exec_())
<强>更新强>:
我开始编写一个自定义标题类,用于实现用户调整垂直标题宽度的大小。它几乎有效,但我无法找到一种方法来在用鼠标拖动时正确更新视图。无论如何,这里有一个我到目前为止的演示,以防任何人都能看到如何使它工作:
import sys
from PyQt4 import QtCore, QtGui
class HeaderView(QtGui.QHeaderView):
def __init__(self, table):
super(HeaderView, self).__init__(QtCore.Qt.Horizontal, table)
self.setClickable(True)
self.setHighlightSections(True)
self.setResizeMode(QtGui.QHeaderView.Interactive)
self._vheader = table.verticalHeader()
self._resizing = False
self._start_position = -1
self._start_width = -1
def mouseMoveEvent(self, event):
if self._resizing:
width = event.x() - self._start_position + self._start_width
if width > 0:
self._vheader.setFixedWidth(width)
# TODO: find a proper replacement for this
self.geometriesChanged.emit()
else:
super(HeaderView, self).mouseMoveEvent(event)
if 0 <= event.x() <= 3:
if not self.testAttribute(QtCore.Qt.WA_SetCursor):
self.setCursor(QtCore.Qt.SplitHCursor)
def mousePressEvent(self, event):
if not self._resizing and event.button() == QtCore.Qt.LeftButton:
if 0 <= event.x() <= 3:
self._start_position = event.x()
self._start_width = self._vheader.width()
self._resizing = True
return
super(HeaderView, self).mousePressEvent(event)
def mouseReleaseEvent(self, event):
self._resizing = False
super(HeaderView, self).mouseReleaseEvent(event)
class Window(QtGui.QWidget):
def __init__(self, rows, columns):
super(Window, self).__init__()
self.table = QtGui.QTableView(self)
self.table.setHorizontalHeader(HeaderView(self.table))
self.table.verticalHeader().setTextElideMode(QtCore.Qt.ElideRight)
model = QtGui.QStandardItemModel(rows, columns, self.table)
for row in range(rows):
item = QtGui.QStandardItem('FOO_BAR_123_AB_CD_%s' % row)
item.setToolTip(item.text())
model.setVerticalHeaderItem(row, item)
for column in range(columns):
item = QtGui.QStandardItem('(%d, %d)' % (row, column))
item.setTextAlignment(QtCore.Qt.AlignCenter)
model.setItem(row, column, item)
self.table.setModel(model)
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.table)
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
window = Window(15, 5)
window.setGeometry(600, 100, 400, 300)
window.show()
sys.exit(app.exec_())
答案 1 :(得分:1)
要修复此不稳定行为并使其平滑调整大小,您应该使用全局坐标空间而不是headerView的本地坐标。 为此,只需将event.x()替换为event.globalX()
即可 #width = event.x() - self._start_position + self._start_width
width = event.globalX() - self._start_position + self._start_width
#self._start_position = event.x()
self._start_position = event.globalX()
我还改变了从垂直标题而不是水平标题发出的几何变换信号。因为它是垂直标题,实际上改变了大小。然而,在我的测试案例中,我无法说明这一点很重要,但从概念上讲它似乎是正确的。
#self.geometriesChanged.emit()
self._vheader.geometriesChanged.emit()
答案 2 :(得分:0)
PyQt往往有一些糟糕的文档,但this page提供了有关QTableView类的所有可能信息。
我不确定您的具体问题是什么,但您可以尝试:
sealed trait Animal
case class Dog(id: Int) extends Animal
case class Cat(id: Int) extends Animal
case class Owl(id: Int) extends Animal
object AnimalHandler {
def handle(animal: Animal) = animal match {
case Dog => processDog(dog)
case Cat => processCat(cat)
}
}
The documentation of .setSectionResize()
或者,如果要将每个标题的大小调整为设定大小,请尝试:
self.tableView.horizontalHeader().setSectionResizeMode(3)