4

私は Qt を試してみて、その値に基づいてカスタム テキストの色でモデルを表示したいと考えています。カラーでレンダリングするのはオプションの設定なので、モデルで Qt::ForegroundRole を使用することは避け、代わりにこれを QStyledItemDelegate に実装したいと思います。次のサンプルでは、​​ を呼び出しQStyledDelegate::paintてから、 を使用して同じテキストの追加コピーを赤で描画しますpainter->drawText。私の予想では、それらは完全に重なるはずですが、実際には を使用するとテキストの周りに余白があるようQStyledDelete::paintです。

これは、私が話していることをよりよく示す写真へのリンクです。

ここに画像の説明を入力

次に、関連するソース コードについて説明します。
mainwindow.cpp内容:

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->treeView->setItemDelegate(new TestDelegate());

    QStandardItemModel *model = new QStandardItemModel(this);
    ui->treeView->setModel(model);

    QList<QStandardItem*> items;
    items << new QStandardItem("Moose")
          << new QStandardItem("Goat")
          << new QStandardItem("Llama");

    model->appendRow(items);
}

testdelegate.cpp内容:

void TestDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QStyledItemDelegate::paint(painter, option, index);
    if (index.data().toString() == "Goat") {
        painter->save();
        painter->setPen(Qt::red);
        painter->drawText(option.rect, option.displayAlignment, index.data().toString());
        painter->restore();
    }
}

この前述の動作は、Qt 4.8.x を実行している Windows 7 と Linux Mint テスト ボックスの両方で発生します。両方のシステムでのテキスト マージンは x+3、y+1 のように見えます。それでも、これはフォントに依存する可能性があるのではないかと心配しており、物事を壊す可能性のあるオフセットをハードコーディングしたくありません.

何か案は?

4

1 に答える 1