• 6194阅读
  • 3回复

[提问]QGraphicsScene中QGraphicsItem单选的问题 [复制链接]

上一主题 下一主题
离线liuweilhy
 

只看楼主 倒序阅读 楼主  发表于: 2016-05-07

QGraphicsScene内QGraphicsItem选中状态的默认设置为:
1、左键单击选中,单击场景区域别处(包括场景内外)取消选中 ;
2、如果单击时按住Ctrl键,则不取消前面已有的选择,执行多选。
请问如何修改使之仅保持一个选中项,类似于QRadioButton的效果?
恳请高手给个思路,多谢!
离线XChinux

只看该作者 1楼 发表于: 2016-05-07
只能自己程序判断了,谁当前被选中了,就将其它元素的选中状态都取消掉。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线liuweilhy

只看该作者 2楼 发表于: 2016-05-07
回 XChinux 的帖子
XChinux:
只能自己程序判断了,谁当前被选中了,就将其它元素的选中状态都取消掉。

谢谢版主回复!
我重载QGraphicsScene的eventFilter函数, 监视QEvent::GraphicsSceneMousePress鼠标按下事件,如下:
  1. if (event->type() == QEvent::GraphicsSceneMousePress)
  2.         {
  3.             QGraphicsSceneMouseEvent *mouseEvent = static_cast <QGraphicsSceneMouseEvent *> (event);
  4.             // 得到当前点最高层的Item
  5.             QGraphicsItem * item = scene.itemAt(mouseEvent->scenePos(), QTransform());
  6.             // 空对象指针也能用data()方法
  7.             // 如果有别的棋子,就选中它,并消除其它棋子的选中状态
  8.             if (qgraphicsitem_cast <PieceItem *> (item))
  9.             {
  10.                 scene.clearSelection();
  11.                 item->setSelected(true);
  12.                 piece = (PieceItem *) item;
  13.                 playSound(soundChoose);
  14.                 //qDebug() << item->isSelected();
  15.                 // 不过滤掉,否则不能处理默认的拖放事件
  16.             }
  17.             else
  18.                 return true;   // 过滤掉以免当前选中状态丢失
  19.         }
但这样做,按Ctrl后单击会取消所有项的选中状态,有些无奈。我不知道是不是还要重载更深一层的函数才行……

离线never_forget

只看该作者 3楼 发表于: 2016-05-08
这个是不是要重载 项 的函数,毕竟被选中的的这个动作发生在项的身上,还是有这个可能的吧。就是这么一说!
快速回复
限100 字节
 
上一个 下一个