1

セル/行を次のように表示したいと思いますQTableView

ここに画像の説明を入力してください

Ubuntuを実行すると、とのQStyledItemDelegate両方で機能しますが、Windowsでは、メソッドを再実装しない場合にのみ機能します。QTreeViewQTableViewQTreeViewpaint

だから私の2つの質問は次のとおりです。

QStyledItemDelegate上の画像のようにするにはどうすればよいQTableViewですか?

QStyledItemDelegate再実装するときに、を上の画像のようにするにはどうすればよいpaintですか?

テキストの横の画像は必要ありません。スタイル付きのホバーと選択ボックスを探しています。これが必要な場合に備えて、私のQtバージョンは4.7.2です。

4

2 に答える 2

1

qtcentreで同じことを求めるスレッドを開きました。私に答えてくれた人は、C++で書かれたコード例と結果を示す写真を私に提供してくれます。C ++では正常に動作するようですが、PySide(pyQtについては知らない)では動作しないため、バグである可能性があります。

これは動作するコードです:

void ProgressBarDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const
{
QStyledItemDelegate::paint(painter, option, index);

if( index.column() == 1 )
{
int progress = index.data().toInt();

QStyleOptionProgressBar progressBarOption;
progressBarOption.rect = option.rect;
progressBarOption.rect.setTop( option.rect.top() + 1 );
progressBarOption.rect.setHeight( option.rect.height() - 2 );
progressBarOption.minimum = 0;
progressBarOption.maximum = 100;
progressBarOption.progress = progress;
progressBarOption.text = QString::number(progress) + "%";
progressBarOption.textVisible = true;
progressBarOption.textAlignment = Qt::AlignCenter;

QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter);
}
}
于 2012-03-14T18:41:30.750 に答える
1

私はついにそれを十分に理解しました。

私が解決しなかったのは、オーバーライドしないQStyledItemDelegate.paint()と、次のようにオーバーライドするのとは異なる効果がある理由です。

def paint(self, painter, option, index):
    QStyledItemDelegate.paint(self, painter, option, index)

とにかく、それは私の質問の一部ではありませんでした。


私が解決したのは、手動でペイントするときにネイティブの外観を取得する方法です。以前、アイテムをペイントするとき、私は以下を使用しました:

QApplication.style().drawControl(QStyle.CE_ItemViewItem, option, painter)

ネイティブのフォーカスまたは選択範囲をペイントしないという問題がありました。のメソッドシグネチャを見ましたQApplication.style().drawControl()

void QStyle::drawControl ( ControlElement element, const QStyleOption * option,
                           QPainter * painter, const QWidget * widget = 0 )

パラメータに気づきwidget、 を渡そうとしましたQTreeView。出来た。何QTreeViewが渡されても問題ありませんが、ビューがネイティブにレンダリングされます。

つまり、ネイティブのレンダリングは次のQTableView呼び出しと同じくらい簡単です。

QApplication.style().drawControl(QStyle.CE_ItemViewItem, option, painter, QTreeView())

QStyledItemDelegateペイント方法で。

于 2012-08-29T23:42:04.510 に答える