QStyledItemDelegate :: paint - 为什么我的文字没有正确对齐?

时间:2013-04-03 02:46:49

标签: c++ qt

我正在给Qt,并希望根据其值以自定义文本颜色显示模型。这是一个可选的设置来呈现它的颜色,所以我想避免在我的模型中使用Qt :: ForegroundRole,而是在QStyledItemDelegate中实现它。在下面的示例中,我调用QStyledDelegate::paint,然后使用painter->drawText继续使用红色绘制相同文本的其他副本。我的期望是它们应该完美叠加,而实际上在使用QStyledDelete::paint时文本周围似乎存在边缘。

这是一张图片的链接,可以更好地展示我所说的内容:

enter image description here

现在提供一些相关的源代码 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;但我担心这可能是依赖于字体的,并且不希望硬编码可能会破坏事物的偏移。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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那么糟糕 - 你可能不那么“幸运”。