Подклассы QPixmap

Я хотел бы получать события нажатия мыши на QPixmap в Qt. Я попытался подклассифицировать его, используя:

class CustomPixmap : public QPixmap
{
    Q_OBJECT

public:
    CustomPixmap(QPaintDevice *parent = NULL);
    ~CustomPixmap() {};

protected:
    void mousePressEvent(QMouseEvent *event);

};

Но не компилируется из-за ошибки

./moc_output/moc_customPixmap.cpp:52:8: error: no member named
      'staticMetaObject' in 'QPixmap'; did you mean simply 'staticMetaObject'?

Извлечение Q_OBJECT компилируется нормально, но mousePressEvent не вызывается. Как я могу правильно подклассифицировать QPixmap для получения событий нажатия мыши?


person Laurent Crivello    schedule 18.11.2015    source источник


Ответы (2)


Нет смысла получать события мыши в QPixmap, потому что QPixmap не является QWidget, и поэтому QPixmap никогда не присутствует напрямую в вашем графическом интерфейсе Qt.

На экране находится своего рода QWidget, который рисует и отображает QPixmap. Это может быть QLabel или, возможно, QWidget, чей метод paintEvent(QPaintEvent *) был переопределен для вызова painter.drawPixmap() с вашим QPixmap в качестве аргумента. Разумным местом для переопределения mousePressEvent() будет подкласс этого виджета, а не подкласс QPixmap.

person Jeremy Friesner    schedule 19.11.2015
comment
Спасибо; Итак, как конкретно связать мой QPixmap с QWidget? - person Laurent Crivello; 19.11.2015
comment
Добавление растрового изображения в мою QGraphicsScene дает мне QGraphicsPixmapItem. Это тот, на котором я должен перехватывать события мыши? Если да то как, спасибо. - person Laurent Crivello; 19.11.2015
comment
Переопределить метод QGraphicsItem::mousePressEvent(QGraphicsSceneMousePressEvent *). doc.qt.io/qt-4.8/qgraphicsitem.html#mousePressEvent - person Jeremy Friesner; 23.11.2015

В конце концов я использовал QPushButton:

QPushButton *button = new QPushButton;
button->setIcon(QIcon(myQPixmap));
buttonWidget=MySceneClass->scene()->addWidget(button);
QObject::connect(button, SIGNAL(clicked()),this, SLOT(clickedSlot()));
person Laurent Crivello    schedule 19.11.2015