QGraphicsPixmapItem不响应鼠标的问题
QGraphicsPixmapItem不响应鼠标的问题
在重构一个派生于QGraphicsPixmapItem
的类, 重写了其重绘函数, 实际上就是废弃了利用QGraphicsPixmapItem
自己的paint()
行为, 改为自行实现了. 但是写完了之后发现功能都正常, 但是就是无法响应鼠标点击操作, 而在别处通过程序触发的select事件它依然能够正常响应和更新显示.
这个问题很令人迷惑, 仔细复查代码才注意到, 在重构的过程中, 我删除了setPixmap()
的调用. 所以问题就清楚了. QGraphicsPixmapItem
重载实现了boundingRect()
和shape()
两个函数, 这两个函数的实现都是基于设置的QPixmap
来进行的. 在重构时, 因为不使用它的重绘机制, 实际上是把它当作是QGraphicsItem
来用, 只是因为修改基类影响到其他地方才没有动作.
问题修改就很容易了, 重载shape()
就解决了:
1 | QPainterPath ChromosomePixmapItem::shape() const |
新老构造函数的对比: 在老的creator中, 使用setPixmap()
了, 而新的构造函数里面没有这一句. 就使得这个QGraphicsPixmapItem
一直是一个空的Item. 但是我实现了boundingRect()
, 但是没有实现shape()
.
手册上说shape()
如果未定义, 会使用boundingRect()
, 但是这句话可能不能全信.
1 | ChromosomePixmapItem::ChromosomePixmapItem(const Chromosome &chromo, const cv::Mat &mitosis_image, const ChromShowParam &show_param, const ChromEnhanceParam &enhance_param) |
事后回顾,其实从QPixmapPixmapItem
派生并不是一个很好的方法,看似省事,实际上反倒是依赖了黑盒的东西。还不如老老实实直接从QPixmapItem
直接走方便。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 编程随笔!