【问题标题】:Painting on a QPixmap which is in QListWidget在 QListWidget 中的 QPixmap 上绘画
【发布时间】:2012-03-07 13:51:09
【问题描述】:

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

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

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

【问题讨论】:

    标签: qt qpainter qlistwidget qpixmap qitemdelegate


    【解决方案1】:

    我不知道 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

    【讨论】:

    • 感谢您的回复。我也在 ListWidget 中做了类似的事情。在 Delegate::paint() 方法中将修改后的 Qpixmap 绘制到 listItem 中时,我们需要给出绘制 QPixmap 的坐标。我的问题是如何找到这些坐标,因为我的 QPixmap 是居中对齐的。 option.rect().x() 和 y() 给出项目的左上角坐标值。有什么办法可以画中心对齐吗?还是我们需要手动计算?
    • 我无法弄清楚您在做什么 :-) 也许您可以更具体地说明您使用 QPixmap 所做的事情以及为什么需要坐标。
    • 让我谈谈我的实际问题。在每个 listItem 中,我都有一个 QPixmap。每个 QPixmap 的大小都是可变的。如果我单击 listItem 相应的图片应该以这样一种方式突出显示,即必须在该图片周围绘制圆角矩形。因此,在委托绘制方法中,我获取数据(QPixmap)并在其周围绘制圆角矩形。然后我想在中心对齐的 ListWidgetItem 上绘制更新的 QPixmap。为了绘制 QPixmap,我们需要指定 QRect。无论如何我们可以手动计算中心对齐的几何形状,但我想知道有没有更好的方法
    • 我为中心对齐打开了一个单独的线程:stackoverflow.com/questions/9614586/… 但我想知道是否有更好的方法来突出显示(绘制圆角矩形)QPixmap 以满足我的要求
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多