0

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

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

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

4

1 回答 1

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

于 2012-03-07T22:52:04.660 回答