나는 Qt를 사용하고 있으며 값에 따라 사용자 정의 텍스트 색상으로 모델을 표시하고자한다. 색상으로 렌더링하는 옵션 설정이므로 내 모델에서 Qt :: ForegroundRole을 사용하지 말고 대신 QStyledItemDelegate에 구현하십시오. 다음 샘플에서는 QStyledDelegate::paint
을 호출 한 다음 painter->drawText
을 사용하여 동일한 텍스트의 추가 복사본을 빨간색으로 그립니다. 내 예상은 그들이 완벽하게 오버레이되어야한다는 것이며, 실제로는 QStyledDelete::paint
을 사용할 때 텍스트 주위에 여백이있는 것으로 보입니다.QStyledItemDelegate :: 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 및 리눅스 민트 테스트 상자 모두에서 발생합니다 두 시스템 아래의 텍스트 여백은 x + 3, y + 1로 나타납니다. 그러나 나는 이것이 폰트에 의존적 일 수 있고 잠재적으로 사물을 망칠 수있는 하드 코드 오프셋을 원하지 않는다는 것을 두려워한다.
아이디어가 있으십니까?
조금 놀아봤을 때 다음을 사용하여이 작업을 수행했습니다. 'QStyleOptionViewItemV4 opt = option; initStyleOption (& opt, index); opt.palette.setBrush (QPalette :: Text, QBrush (Qt :: red)); QApplication :: style() -> drawControl (QStyle :: CE_ItemViewItem, & opt, painter); 'QApplication :: syle()'대신'opt.widget-> style()'도 사용할 수 있습니다. QApplication이 포함되지 않도록하십시오. (이 코멘트의 서식 지정에 실패한 것에 대해 사과드립니다.) –
이것은 같은 것이 아닙니다. 항목보기 항목을 가져올 텍스트를 그리는 것에 대해 질문했지만 색 요소가있는 항목보기 항목을 그리는 반면 (사용자 지정 대리자가 필요하지 않은 적절한 색상 역할을 사용하여 모델에서 수행 할 수있는 작업) – cmannett85