2010-03-02 169 views
1

在Qt中,我想定制QT Symbian中的listview。所以为了定制目的,我为listview设置了委托。我也处理绘画事件..问题是文字颜色。错误代码

从列表视图中选择项目时,我没有得到默认的文本颜色。

,即下面的示例代码,我有两个字符串即“项”(主字符串)和“测试”(子字符串)

主弦与默认选择的颜色绘制,但子字符串不能用与主要字符串相同的颜色绘制。

我认为我们需要处理选择和获取调色板颜色..我没有得到确切的方式。

请给我解决方案。

这里是代码

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(); 
} 

请帮我

感谢ü

+0

你怎么禁用Q_OBJECT宏? – bgs 2010-03-02 17:39:09

+0

@Karol,Q_OBJECT宏只有当我们使用QT中的使用信号和插槽时才需要..对于元对象.. 因为我没有在这里使用任何信号插槽..所以它不是必需的 – Naruto 2010-03-03 04:55:28

回答

0

这是symbian Qt 4.6.2中的一个bug。

希望它会在下一版本中得到修复..

FYI ....

Check out here

0

试试这个 -

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 2010-03-03 07:10:33