5

QTreeView 内にカスタム QItemDelegate 描画テキストがあります。paint() では、スタイルからセルのサイズを取得します。次に、現在のセルの幅を使用して、wordwrap でテキストを描画します。

sizeHint() では、実際には高さだけを計算したいのです。幅は、現在のセルの幅と同じにする必要があります。ユーザーがセルの幅を変更すると、sizeHint はワードラップされたテキストの新しい高さを計算し、それを返します。

問題は、paint() のように sizeHint() 内でセル幅を取得できないことです。私が使用していた:

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

これは paint() では機能しますが、sizeHint() では -1 を返します。sizeHint() で現在のセル幅を取得するにはどうすればよいですか?

4

1 に答える 1

6

オリジナル: 基本クラスの 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);
于 2012-01-19T23:56:04.043 に答える