我正在尝试使用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;然而,我担心这可能与字体有关,不希望硬编码偏移量可能会破坏事物。
有什么想法吗?
QStyleOptionViewItemV4 opt = option; initStyleOption(&opt, index); opt.palette.setBrush(QPalette::Text, QBrush(Qt::red)); opt.widget->style()->drawControl(QStyle::CE_ItemViewItem, &opt, painter);
可以使用opt.widget->style()
代替QApplication::style()
,以避免包含 QApplication。(对于格式不正确的评论表示歉意。) - Random Llama