• 6028阅读
  • 9回复

QGraphicsItem没有获取鼠标点击事件 求指教 [复制链接]

上一主题 下一主题
离线seffrui
 

只看楼主 正序阅读 楼主  发表于: 2014-02-05
  1. #ifndef MYITEM_H
  2. #define MYITEM_H
  3. #include <QGraphicsWidget>
  4. #include <QMouseEvent>
  5. class myItem : public QGraphicsWidget
  6. {
  7.     Q_OBJECT
  8. public:
  9.     explicit myItem();
  10.     QRectF boundingRect()const;
  11.     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
  12.     void mousePressEvent(QGraphicsSceneMouseEvent *event);
  13. signals:
  14. public slots:
  15. private:
  16.     QBrush *brush;
  17. };
  18. myItem::myItem()
  19. {
  20.    brush=new QBrush(Qt::red);
  21.    setFlag(QGraphicsItem::ItemIsFocusable);
  22. }
  23. QRectF myItem::boundingRect()const
  24. {
  25.     return QRectF(-15.5,-15.5,30.1,30.1);
  26. }
  27. void myItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
  28. {
  29.    painter->setBrush(*brush);
  30.    painter->drawRect(-15,-15,30,30);
  31. }
  32. void myItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
  33. {
  34.     setFocus();
  35. }
  36. int main(int argc, char *argv[])
  37. {
  38.     QApplication a(argc, argv);
  39.     myItem t;
  40.     QGraphicsScene w;
  41.     w.addItem(&t);
  42.     QGraphicsView v;
  43.     v.setScene(&w);
  44.     v.show();
  45.     return a.exec();
  46. }
  47. #endif // MYITEM_H


每次用qDebug输出焦点Item的时候 都是空
问题出在哪里
看Qt的帮助文档 感觉没问题啊 求大神解释

离线noidea

只看该作者 9楼 发表于: 2014-02-06
提供一个简单QGraphicsItem获取鼠标点击事件的例子,

  1.   
  2. #include <QtGui>
  3. #include <QGraphicsView>
  4. #include <QGraphicsRectItem>
  5. #include <QApplication>
  6. class CustomView : public QGraphicsView
  7. {
  8. protected:
  9.     void mousePressEvent(QMouseEvent *event)
  10.     {
  11.         qDebug() << "Custom view clicked.";
  12.         QGraphicsView::mousePressEvent(event);
  13.     }
  14. };
  15. class CustomItem : public QGraphicsRectItem
  16. {
  17. protected:
  18.     void mousePressEvent(QGraphicsSceneMouseEvent *event)
  19.     {
  20.         qDebug() << "Custom item clicked.";
  21.     }
  22. };
  23. int main(int argc, char *argv[])
  24. {
  25.     QApplication a(argc, argv);
  26.     CustomItem item;
  27.     item.setRect(20, 20, 60, 60);
  28.     QGraphicsScene scene(0, 0, 100, 100);
  29.     scene.addItem(&item);
  30.     CustomView view;
  31.     view.setScene(&scene);
  32.     view.show();
  33.     return a.exec();
  34. }
talk in code
Qt5.2.1 + MacOSX10.9
离线noidea

只看该作者 8楼 发表于: 2014-02-06
还一个问题,

你的问题是关于QGraphicsItem, 而你的代码是QGraphicsWidget, 不知道你是否写错了

  1. class myItem : public QGraphicsWidget
talk in code
Qt5.2.1 + MacOSX10.9
离线noidea

只看该作者 7楼 发表于: 2014-02-06
回 seffrui 的帖子
seffrui:
抱歉  还有个问题 怎么是Item重绘  人为的 什么函数

正如你代码所示,重绘widget的方法是override virtual paint function
  1. void myItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
  2. {
  3.    painter->setBrush(*brush);
  4.    painter->drawRect(-15,-15,30,30);
  5. }
talk in code
Qt5.2.1 + MacOSX10.9
离线seffrui

只看该作者 6楼 发表于: 2014-02-06
回 noidea 的帖子
noidea:所以你的问题是
void myItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
....... (2014-02-06 11:06) 

抱歉  还有个问题 怎么是Item重绘  人为的 什么函数
离线noidea

只看该作者 5楼 发表于: 2014-02-06
回 seffrui 的帖子
seffrui:这不是全部程序.... 就是item不响应鼠标事件 没有接受到 (2014-02-06 11:03) 

所以你的问题是
  1. void myItem::mousePressEvent(QGraphicsSceneMouseEvent *event)

没有被调用吗?

我在你line40之前插入qDebug(), 鼠标事件是响应的。
talk in code
Qt5.2.1 + MacOSX10.9
离线seffrui

只看该作者 4楼 发表于: 2014-02-06
回 noidea 的帖子
noidea:"每次用qDebug输出焦点Item的时候 都是空 ,问题出在哪里 "
没明白,你的程序里没有qDebug,你是说Line40,    setFocus(); 吗? 你要输出什么呢? (2014-02-06 11:00) 

这不是全部程序.... 就是item不响应鼠标事件 没有接受到
离线noidea

只看该作者 3楼 发表于: 2014-02-06
"每次用qDebug输出焦点Item的时候 都是空 ,问题出在哪里 "

没明白,你的程序里没有qDebug,你是说Line40,    setFocus(); 吗? 你要输出什么呢?
talk in code
Qt5.2.1 + MacOSX10.9
离线seffrui

只看该作者 2楼 发表于: 2014-02-05
...
离线seffrui

只看该作者 1楼 发表于: 2014-02-05
求指教啊
快速回复
限100 字节
 
上一个 下一个