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

4

option.rect是项目视图单元格的边界矩形,因此它不包含边距。您需要的偏移量可以通过从当前查询子元素矩形来检索QStyle

...
QStyle* style = QApplication::style();
QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &option);
...
painter->drawText(textRect, option.displayAlignment, index.data().toString());

但是QStyle......是否实现它完全取决于当前。当我尝试将它与 Qt v4.8 一起用于我在 Linux/Gnome 上的应用程序时,它是错误的,并且确实没有在 Qt 源代码中实现。所以我不得不硬编码偏移量,对我来说这并没有我打算自己写的那么糟糕QStyle——你可能没有那么“幸运”。

于 2013-04-03T07:23:07.380 回答