Как получить ширину ячейки QTreeView внутри QItemDelegate sizeHint ()? - PullRequest
5 голосов
/ 20 января 2012

У меня есть собственный чертежный текст QItemDelegate в QTreeView.В paint () я получаю размер ячейки из стиля.Затем я рисую текст с помощью переноса слов, используя ширину текущей ячейки.

В sizeHint () я действительно хочу рассчитать только высоту.Ширина должна быть равной текущей ширине ячейки.Когда пользователь изменяет ширину ячейки, sizeHint просто вычисляет новую высоту текста, завернутого в слова, и возвращает его.

Проблема в том, что я не могу получить ширину ячейки внутри sizeHint (), как яв краске ().Я использовал:

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

Это работает в paint (), но возвращает -1 в sizeHint ().Как получить текущую ширину ячейки в sizeHint ()?

1 Ответ

6 голосов
/ 20 января 2012

Оригинал : я использую метод 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);
...