动态控制QItemDelegate的大小

时间:2016-08-11 03:47:34

标签: qt pyqt pyside

关于QItemDelegatesQListView的尺寸,我有几个问题:

我有一个QListView使用QItemDelegate在代理的自定义paint()方法中呈现小部件,如下所示:

self.thumbnail = MyCustomWidget()
self.thumbnail.render(painter, QtCore.QPoint(option.rect.x(), option.rect.y()))

然而,这显示了QListView中250x260图像的项目,即使MyCustomWidget().sizeHint()为250x250,而且它的maximumSize()也会返回250x250。

我发现罪魁祸首是QListViewspacing,我将其设置为10.如果我将spacing设置为100,我仍然会得到QItemDelegates大小为250x260,但如果我根本不使用setSpacing(),它会按预期在250x250处渲染。 spacing似乎改变了传递给paint方法的option。rect,导致大小不正确。 我确实需要spacing,所以我有点困惑为什么QListView的间距会改变QItemDelegates的大小?这是一个错误吗?

我可以首先渲染QPixmap,然后让painter绘制QPixmap而不是直接渲染到painter来解决此问题:

self.thumbnail = MyCustomWidget()
pixmap = QtGui.QPixmap(self.thumbnail.size())
self.thumbnail.render(pixmap)
painter.drawPixmap(option.rect.topLeft(), pixmap)

这产生250x250图像,这是我需要的,但我不明白为什么第一种方法在使用setSpacing时没有呈现正确的大小?!

现在,更大的挑战是如何通过QItemDelegate动态调整QSlider的大小: 我在QSlider中有一个QListView应该缩放项目,以便用户可以选择在当前视图中查看更小但更多的项目。我测试了一个独立的MyCustomWidget()实例的大小调整,它运行得很好。

但是,代表们不会按预期进行扩展。这是我的委托代码: class Delegate(QtGui.QItemDelegate):

def __init__(self, parent = None):

    super(Delegate, self).__init__(parent)
    self.scaleValue = 100 # size in percent (as returned by QSlider)

def paint(self, painter, option, index):
    proxyModel = index.model()
    item = proxyModel.sourceModel().itemFromIndex(proxyModel.mapToSource(index))
    self.thumbnail = ElementThumbnail(item)
    self.thumbnail.scale(self.scaleValue)

    pixmap = QtGui.QPixmap(self.thumbnail.size())
    self.thumbnail.render(pixmap)
    painter.drawPixmap(option.rect.topLeft() * self.scaleValue / 100.0, pixmap)

    super(Delegate, self).paint(painter, option, index)

def setScaleValue(self, value):
    self.scaleValue = value

def sizeHint(self, option, index):
    return ElementThumbnail.thumbSize  * self.scaleValue / 100.0

并在QListView我使用此插槽连接到滑块的valueChanges信号:

def scaleThumbnails(self, value):
    self.itemDelegate().setScaleValue(value)
    self.update()

结果是QSlider会裁剪QItemDelegate但不会缩放它们,因为QItemDelegatesizeHint()仅在QListView时被调用首先显示。 此外,我需要确保当小部件(最终)按比例缩小时,重新计算QListView的布局,并且更多项目适合可见区域。

简而言之,我的问题是:

  1. 如何在QItemDelegate内动态缩放QListView
  2. 如何在委托大小更改后强制QListView重新计算其布局?
  3. 编辑:问题2:QAbstractItemView.doItemsLayout似乎可以解决问题。仍然想知道问题1,但

    谢谢, 坦率

0 个答案:

没有答案