2010-03-02 4 views
1

QT Symbian의 listview를 사용자 정의하고 싶습니다. 그래서 사용자 지정 목적을 위해 listview에 대한 대리자를 설정했습니다. 그리고 나는 또한 페인트 이벤트를 처리하고 있습니다 .. 문제는 텍스트 색상입니다.Qot의 실수

목록보기에서 항목을 선택하면 기본 텍스트 색이 표시되지 않습니다.

샘플 코드 아래 즉, 내가

메인 캐릭터는 기본 선택 색상으로 그려 두 개의 문자열, 즉 "항목"(메인 캐릭터)와 "테스트"(하위 문자열)을 가지고 있지만, 하위 문자열 것 메인 스트링과 같은 색으로 그려서는 안된다.

나는 우리가 선택을 처리하고 pallete color를 얻을 필요가 있다고 생각한다. 나는 정확한 방법을 얻지 못하고있다.

pls는 해결책을 제공합니다. 여기

class SettingDeligate : public QStyledItemDelegate 
{ 
//  Q_OBJECT 

    public: 
     explicit SettingDeligate(QObject* parent = 0); 
     virtual ~SettingDeligate(); 
     enum ItemDataRole {SubheaderTextRole = Qt::UserRole + 100}; 
     QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const; 
     void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; 
}; 

SettingDeligate::SettingDeligate(QObject* parent) 
     : QStyledItemDelegate(parent) 
{ 
} 

SettingDeligate::~SettingDeligate() 
{ 
} 

QSize SettingDeligate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const 
{ 
     QIcon icon = qvariant_cast<QIcon>(index.data(Qt::DecorationRole)); 
     QString line1 = index.data(Qt::DisplayRole).toString(); 
     QString line2 = index.data(SubheaderTextRole).toString(); 

     int textW = qMax(option.fontMetrics.width(line1), option.fontMetrics.width(line2)); 
     //QSize iconSize = icon.actualSize(option.decorationSize); 
     QSize iconSize(27,19); 
     return QSize(qMax(textW, iconSize.width()) + 4, 
        iconSize.height() + 2 + option.fontMetrics.lineSpacing() * 2 + 4);  
} 

void SettingDeligate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const 
{ 
     QStyledItemDelegate::paint(painter,option,index); 
     QString headerText(qvariant_cast<QString>(index.model()->data(index, SubheaderTextRole))); 
      QPoint point1 (option.rect.topLeft()); 
     painter->drawText(point1.x()+25,point1.y()+25,headerText); 
} 
int main(int argc, char *argv[]) 
{ 
     QApplication a(argc, argv); 

     QListView *MylistView = new QListView(); 
     MylistView->setViewMode(QListView::ListMode); 

     MylistView->setMovement(QListView::Free); 
     MylistView->setItemDelegate(new (SettingDeligate)); 

     MylistView->setSelectionMode(QAbstractItemView::SingleSelection); 


     QStandardItemModel *model = new QStandardItemModel(); 
     MylistView->setModel(model); 


       QStandardItem *item = new QStandardItem("item1"); 
       item->setData("Test1", SettingDeligate::SubheaderTextRole); 
       model->appendRow(item); 

      QStandardItem *item1 = new QStandardItem("item2"); 
       item1->setData("Test2", SettingDeligate::SubheaderTextRole); 
      model->appendRow(item1); 

      QStandardItem *item2 = new QStandardItem("item3"); 
      item2->setData("Test3", SettingDeligate::SubheaderTextRole); 
      model->appendRow(item2); 

       QDesktopWidget* desktopWidget = QApplication::desktop(); 
       //get client rect. 
       QRect clientRect = desktopWidget->availableGeometry(); 

       MylistView->setGeometry(clientRect); 
       MylistView->show(); 
       return a.exec(); 
} 

PLS이 시도 U에게

+0

당신에게 사용할 수 Q_OBJECT 매크로 와서 어떻게? – bgs

+0

@Karol, Q_OBJECT 매크로는 QT에서 신호 및 슬롯을 사용하는 경우에만 필요합니다 .. 여기에서 신호 슬롯을 사용하지 않으므로 .. – Naruto

답변

0

Qt 4.6.2에서 symbian 용 버그입니다.

는 다음 버전에서 수정을 얻을 수 있습니다 희망 .. 참고로

....

Check out here

0

감사 나에게

도움 코드입니다 - colorgroup하는

void SettingDeligate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const 
{ 
    QStyledItemDelegate::paint(painter,option,index); 
    QString headerText(qvariant_cast<QString>(index.model()->data(index, SubheaderTextRole))); 
    QPoint point1 (option.rect.topLeft()); 
    QPalette::ColorGroup colorGroup = QPalette::Normal; 
    if(!option.state.testFlag(QStyle::State_Enabled)) 
     colorGroup = QPalette::Disabled; 
    else if (!option.state.testFlag(QStyle::Active)) 
     colorGroup = QPalette::Inactive; 

    QPalette::ColorRole colorRole = QPalette::Text; 
    if(option.state.testFlag(QStyle::State_Selected)) 
     colorRole = QPalette::HighlightedText; 
    if(option.status.testFlag(QStyle::State_Editing)) 
     colorRole = QPallete::Text; 
    painter->setPen(option.palette.color(colorGroup, colorRole)); 
    painter->drawText(point1.x()+25,point1.y()+25,headerText); 
} 

상태를/colorrole 매핑은 텍스트 도면에서입니다 CE_ItemViewItem 요소에 대한 QCommonStyle :: DrawControl 부분.

+0

안녕하세요. 항목이 선택되면 문제가 발생합니다. 항목을 선택하면 기본 색상이 표시되지 않습니다. – Naruto

관련 문제