2013-04-03 2 views
4

나는 Qt를 사용하고 있으며 값에 따라 사용자 정의 텍스트 색상으로 모델을 표시하고자한다. 색상으로 렌더링하는 옵션 설정이므로 내 모델에서 Qt :: ForegroundRole을 사용하지 말고 대신 QStyledItemDelegate에 구현하십시오. 다음 샘플에서는 QStyledDelegate::paint을 호출 한 다음 painter->drawText을 사용하여 동일한 텍스트의 추가 복사본을 빨간색으로 그립니다. 내 예상은 그들이 완벽하게 오버레이되어야한다는 것이며, 실제로는 QStyledDelete::paint을 사용할 때 텍스트 주위에 여백이있는 것으로 보입니다.QStyledItemDelegate :: 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 및 리눅스 민트 테스트 상자 모두에서 발생합니다 두 시스템 아래의 텍스트 여백은 x + 3, y + 1로 나타납니다. 그러나 나는 이것이 폰트에 의존적 일 수 있고 잠재적으로 사물을 망칠 수있는 하드 코드 오프셋을 원하지 않는다는 것을 두려워한다.

아이디어가 있으십니까?

답변

1

option.rect은 여백이없는 항목보기 셀의 경계 사각형입니다. 당신이 필요로 오프셋 (offset)는 현재 QStyle에서 하위 요소의 사각형을 조회하여 검색 할 수 있습니다 :

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

그러나를 ... 그것은 전적으로 그것을 구현 여부는 현재 QStyle에 달려있다. Linux/Gnome에서 Qt v4.8을 사용하여 응용 프로그램을 사용해 보았는데 잘못되어 실제로 Qt 소스 코드에 구현되지 않았습니다. 그래서 오프셋을 하드 코딩해야했습니다. 내 자신의 코드를 작성하려고 시도했을 때 그렇게 나쁘지는 않았습니다. QStyle - '운이 좋은'것은 아닙니다.

+0

조금 놀아봤을 때 다음을 사용하여이 작업을 수행했습니다. '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이 포함되지 않도록하십시오. (이 코멘트의 서식 지정에 실패한 것에 대해 사과드립니다.) –

+0

이것은 같은 것이 아닙니다. 항목보기 항목을 가져올 텍스트를 그리는 것에 대해 질문했지만 색 요소가있는 항목보기 항목을 그리는 반면 (사용자 지정 대리자가 필요하지 않은 적절한 색상 역할을 사용하여 모델에서 수행 할 수있는 작업) – cmannett85

관련 문제