在QListWidget中的QPixmap上绘画

时间:2012-03-07 13:51:09

标签: qt qpainter qlistwidget qpixmap qitemdelegate

我在QListWidget中有一个QListWidgetItem的列表(Hor滚动条就在那里,因为数量很大的项目)。每个QListWidgetItem包含一个QPixmap作为数据(按比例缩小到某个随机值)。我的要求是点击QPixmap时应突出显示(刷宽10的圆角矩形)。我将每个QListWidgetItem委托给QItemDelegate。我在这里有几个问题。

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

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

1 个答案:

答案 0 :(得分: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