Qt 我可以在QGraphicsItem中获取鼠标事件吗?
我已经子类化了Qt 我可以在QGraphicsItem中获取鼠标事件吗?,qt,qgraphicsview,qgraphicsitem,qmouseevent,Qt,Qgraphicsview,Qgraphicsitem,Qmouseevent,我已经子类化了qgraphicsrecitem,它没有接收任何鼠标事件。我见过其他类似的问题,比如说我需要启用鼠标跟踪,但是setMouseTracking在QWidget中,而QGraphicsItem似乎不是QWidget 我已经实现了绘制,这很有效。在我的子类QGraphicsView中,我得到了鼠标事件 文档似乎认为我应该重写mousePressEvent函数(例如),然后开始获取事件。无论我是否将mousePressEvent转发到QGraphicsView的超类,似乎都没有任何区别。
qgraphicsrecitem
,它没有接收任何鼠标事件。我见过其他类似的问题,比如说我需要启用鼠标跟踪,但是setMouseTracking
在QWidget中,而QGraphicsItem似乎不是QWidget
我已经实现了绘制
,这很有效。在我的子类QGraphicsView中,我得到了鼠标事件
文档似乎认为我应该重写mousePressEvent函数(例如),然后开始获取事件。无论我是否将mousePressEvent转发到QGraphicsView的超类,似乎都没有任何区别。在子类QGraphicsView中,如果希望重写鼠标事件方法向下传播到项,则需要调用它们的默认实现。例如:
CustomView::mousePressEvent(QMouseEvent *event)
{
// handle the event as you like
QGraphicsView::mousePressEvent(event); // then call default implementation
}
如果要接受悬停事件,需要调用QGraphicsItem::setAcceptHoverEvents(true)代码>。否则,不需要启用任何特定的鼠标跟踪
编辑:下面是一个完整的工作示例:
#include <QtGui>
class CustomView : public QGraphicsView
{
protected:
void mousePressEvent(QMouseEvent *event)
{
qDebug() << "Custom view clicked.";
QGraphicsView::mousePressEvent(event);
}
};
class CustomItem : public QGraphicsRectItem
{
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event)
{
qDebug() << "Custom item clicked.";
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
CustomItem item;
item.setRect(20, 20, 60, 60);
QGraphicsScene scene(0, 0, 100, 100);
scene.addItem(&item);
CustomView view;
view.setScene(&scene);
view.show();
return a.exec();
}
#包括
类CustomView:公共QGraphicsView
{
受保护的:
作废鼠标压力事件(QMouseEvent*事件)
{
qDebug()我遇到了与您相同的问题,我想在Anthony非常好的答案的基础上添加一些见解。下面是我编写的一个示例,展示了可以使用鼠标事件和键盘事件实现的一些功能
请注意,事件不会传播到QGraphicsItemGroup
或QList
中的QGraphicsItem
(我花了一段时间才弄清楚)
#包括
#包括
#包括
#包括
#包括
类CustomItem:公共QGraphicsSellipseitem
{
受保护的:
无效鼠标压力事件(QGraphicsSceneMouseEvent*事件)
{
如果(事件->按钮()==Qt::LeftButton){
if(事件->修饰符()==Qt::ShiftModifier){
qDebug()修饰符()==Qt::AltModifier){
qDebug()scenePos();
qDebug()pos().y()-dist,dist*2,dist*2);
}else if(事件->修改器()!=Qt::AltModifier){
qDebug()setRect(pt.x()-25,pt.y()-25,50,50);
item->setFlags(QGraphicsItem::ItemIsSelectable|
QGraphicsItem::ItemIsMovable);
增编(项目);
}else if(事件->按钮()==Qt::RightButton){
//检查光标下是否有项目
QGraphicsItem*itemToRemove=NULL;
foreach(自动项目,项目(事件->场景()){
如果(项->类型()==QGraphicsItem::UserType+1){
itemToRemove=项目;
打破
}
}
如果(项目删除){
//从Graphicscene中删除该项
移除项目(项目移除);
}
}
}
}
void mouseMoveEvent(QGraphicsSceneMouseEvent*事件)
{
qDebug()key()==Qt::key\u退格){
//删除所有选定项目
qDebug()我遇到了一个类似的问题,视图不接受鼠标单击。问题是我需要启用视图(ui->view->setEnabled(true)).如问题中所述,我尝试过。我在QGraphicsSitem中的mousepress事件上有一个断点,无论我是否调用它,它都不会被调用QGraphicsView::MousePresseEvent(事件);
@Almo是否覆盖子类QGraphicscene中的任何鼠标事件?在我的QGraphicsView子类中,我创建了一个QGraphicscene,并用它调用setScene。我没有子类QGraphicscene。@Almo查看编辑的工作示例。我猜您的QGraphicsSitem::boundingRect()
没有返回正确的rect,或者如果您重新实现了QGraphicsItem::shape()
,这是不对的。Argh.qgraphicsceneouseevent
。我一直在寻找QMouseEvent
作为参数,因为QGraphicsView
覆盖使用了这些。我没有注意到它们对于QGraphicsItem
是不同的。你的例子指出了这一点。我感到尴尬。)