2012-03-07 42 views
0

我在QListWidget中有一个QListWidgetItem的列表(由于数量巨大,Hor滚动条在那里)。每个QListWidgetItem都包含一个QPixmap作为数据(缩小到某个随机值)。我的要求是当点击一个QPixmap时应该突出显示(刷宽为10的四舍五入)。我将每个QListWidgetItem委托给一个QItemDelegate。我在这里有几个问题。在QListWidget的QPixmap上绘画

  1. 如何在选择相应的QListWidgetItem时绘制QPixmap的圆角矩形?

  2. 当点击QPixmap(不在QListWidgetItem的其他部分)时,上述绘制事件应该会发生。由于QPixmaps大小不同,QListWidgetItem中的QPixmaps的顶部和底部部分将为空,并且单击此处也会触发ItemDelegate。如何摆脱这种选择?

回答

0

我不知道QListWidget是否可能,因为我从来没有这样做过。但是,我使用QListView和自定义模型以及委托来完成它。它的要点是这样这样:

里面我的自定义QAbstractListModel

QVariant data(const QModelIndex &index, int role) const 
{ 
    if(index.isValid()) 
    { 
     switch(role) 
     { 
      case MyCustomRole: 
       return QVariant(*pointerToMyQPixmap); 
      break; 
... 

里面我的自定义QStyledItemDelegate

void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const 
{ 

... 

    // Best make DAMN sure it's not null else we will crash and burn. 
    QPixmap pix = index.data(myCustomRole).value<QPixmap>(); 
    painter->drawPixmap(1, 1, pix); 

... 

在我看来,Qt的模型/视图框架有点跛脚,但直到他们意识到,如果你需要的东西除了它们在框架中提供的内置小部件的基本特征,你必须学习。换句话说,如果你与QListWidget想要更多的功能,你需要上晚自习的而QListView和实现自己的模型和视图

http://qt-project.org/doc/qt-4.8/qlistview.html#details

+0

感谢您的答复。我也在ListWidget中做了这样的事情。在Delegate :: paint()方法中将修改后的Qpixmap绘制到listItem中时,我们需要给出绘制QPixmap的坐标。我的问题是如何找到这些坐标,因为我的QPixmap是居中对齐的。 option.rect()。x()和y()给出项目的左上角坐标值。有没有办法让绘画中心对齐?还是我们需要手动计算? – 2012-03-08 07:03:30

+0

我很难弄清楚你在做什么:-)也许你可以更具体地说明你在用QPixmap做什么以及为什么你需要坐标。 – 2012-03-08 10:52:10

+0

让我告诉我的实际问题。在每个listItem中我有一个QPixmap。每个QPixmap的大小都是可变的。如果我点击listItem,相应的图片应该以这样的方式突出显示,即必须围绕该图片绘制圆角矩形。 因此,在委托绘画方法中,我获取数据(QPixmap)并在其周围绘制圆角矩形。然后我想在中心对齐的ListWidgetItem上绘制更新后的QPixmap。为了绘制QPixmap,我们需要指定QRect。无论如何,我们可以手动计算中心对齐的几何图形,但我想知道是否有更好的方法 – 2012-03-08 13:50:59