ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

如何在QItemDelegate sizeHint()中获取QTreeView单元格宽度?

2019-06-21 03:42:28  阅读:204  来源: 互联网

标签:python qt paint pyqt qitemdelegate


我在QTreeView中有一个自定义QItemDelegate绘图文本.在paint()中,我从样式中获取单元格的大小.然后我使用wordwrap使用当前单元格的宽度绘制文本.

在sizeHint()中,我真的只想计算高度.宽度应该是当前单元格宽度.当用户更改单元格宽度时,sizeHint将只计算单词包装文本的新高度并返回该高度.

问题是我无法像在paint()中那样获取sizeHint()中的单元格宽度.我用的是:

style = QApplication.style()
style.subElementRect(QStyle.SE_ItemViewItemText, option).width()

这适用于paint(),但在sizeHint()中返回-1.如何在sizeHint()中获取当前单元格宽度?

解决方法:

原文:我使用基类’sizeHint()方法来获取单元格大小,然后根据需要修改QSize,如下所示:

QSize MyDelegate::sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const
{
    QSize sz=QItemDelegate::sizeHint(option, index);
    int h=sz.height();

    < MODIFY h HERE > 

    sz.setHeight(h);
    return sz;
}

似乎工作正常.

编辑:海报表明这对他不起作用……所以这是另一个选项,也许不是最优雅的:向委托添加一个视图成员(我想不出从委托中获取的方式),并使用模型索引来获取标题的节大小.例如:

class MyDelegate : public QItemDelegate
{
public:
    <the usual, then add>

    void setView(QAbstractItemView* v) { theView=v; }

protected:
    QAbstractItemView* theView;
};

并在实施中

QSize MyDelegate::sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const
{
    int theWidth=-1;

    // handle other types of view here if needed
    QTreeView* tree=qobject_cast<QTreeView*>(theView);
    if(tree)
    {
        qDebug("WIDTH @ %d : %d",index.column(),tree->header()->sectionSize(index.column()));
        theWidth=tree->header()->sectionSize(index.column());
    }

    QSize sz=QItemDelegate::sizeHint(option, index);
    if(theWidth>=0)
        sz.setWidth(theWidth);

    // compute height here and call sz.setHeight()

    return sz;
}

只剩下要做的就是在代码中创建委托后,调用setView():

MyDelegate* theDelegate=new MyDelegate(...);
theDelegate->setView(theView);

标签:python,qt,paint,pyqt,qitemdelegate
来源: https://codeday.me/bug/20190621/1251496.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有