[英]Deleting a QGraphicsItem/QGraphicsObject from QGraphicsScene?
我已经创建了Qt GUI应用程序。 它由QGraphicsScene
组成,并且通过按下或触发pushbutton
s将项目( QGraphicsItem
)添加到其中。 添加到场景中的每个项目都是从QGraphicsItem
派生的不同类的成员。 现在,我面临的挑战是通过以下机制之一从场景中删除添加的项目:
1)右键单击添加的项目,创建一个上下文菜单,然后使用scene->removeItem(addedItem);
2)双击删除该项目的项目
3)使用标志ItemIsSelectable
选择一个项目,然后通过按键盘上的Delete键删除该项目
但话虽如此,作为Qt的新手,我无法执行第1条操作,因为右键单击时不会显示上下文菜单。 在数字2的情况下,我使用了信号和插槽,双击某个项目时会发出一个信号,并且mainWindow
的插槽会吸收信号并删除该项目。 但是通过这种方式,当我将Q_OBJECT
宏添加到项目类的头文件中时,由于错误“找到重复的符号”,程序无法编译。
因此,我最后的选择是在屏幕上选择一个项目,并通过按Delete键来丙烷键盘信号以删除该项目。 怎么做? 如果上述任何一种方法都可以轻松完成,请给我建议,以防万一我做错了。
PS:我知道有很多关于从QGraphicsScene
删除QGraphicsItem
的查询,但是都没有一个可靠的答案。
...我无法执行第1个操作,因为右键单击时上下文菜单未显示。
有两种可能的方法可以完成此操作:
尽管第二种方法会花费更多时间,但我认为它可能是一个更好的系统,因为它将与您要删除的项目更加融合。 第一种方法也是可行的,如果它不起作用,则可以在SO上发布示例问题。
2,我使用信号和插槽,...是因为在向头文件添加Q_OBJECT宏时出现“发现重复的符号”错误
听起来您正在尝试将信号/插槽功能添加到从QGraphicsItem派生的类中。 您不需要这样做。 如果您想在QGraphicsScene中的项目上使用信号和插槽,则Qt提供了QGraphicsObject类,您可以从该类而不是QGraphicsItem派生。
通过按Delete来传递键盘信号以删除项目。
我认为您的意思是“传播”键盘信号。 通过重写QGraphicsScene及其keyPressEvent或keyReleaseEvent,可以获取所选项目的列表并将其从场景中删除。 这是一个基本示例:-
class MyScene : public QGraphicsScene
{
protected:
void keyReleaseEvent(QKeyEvent * keyEvent);
};
void MyScene::keyReleaseEvent(QKeyEvent * keyEvent)
{
if(keyEvent->key() == Qt::Key_Backspace)
{
QList<QGraphicsItem*> selectedItems = selectedItems(); // get list of selected items
foreach(QGraphicsItem* item, selectedItems)
{
removeItem(item);
delete item;
}
}
}
您正在寻找很多答案,而不是如何处理QGraphicsItem或QGraphicsScene。
1)右键单击添加的项目,创建一个上下文菜单,然后使用scene->removeItem(addedItem);
在这里 。
2)双击该项目,这将删除该项目-您需要处理双击,然后对QGraphicsItems进行命中测试,您必须实现mouseDoubleClickEvent(QMouseEvent *e)
并将e的pos()
传递给它以确定是否单击QGraphicsItem。
3)使用标志ItemIsSelectable
选择一个项目,然后通过按键盘上的Delete键删除该项目-我不确定ItemIsSelectable
标志。 但是,您将需要#2。 并通过重写此方法来学习如何处理键盘输入:
void QWidget::keyPressEvent( QKeyEvent *k ){
switch ( tolower(k->ascii()) ) {
case '\x08': \\backspace
break;
case '\x7F': \\delete
break;
}
}
还有Qt :: key枚举,其中包含Key_Backspace和Key_Delete。 如果您不喜欢处理ASCII字符代码,则可以针对QKeyEvent :: Key()的返回值进行测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.