繁体   English   中英

从QGraphicsScene删除QGraphicsItem / QGraphicsObject吗?

[英]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个操作,因为右键单击时上下文菜单未显示。

有两种可能的方法可以完成此操作:

  1. 创建一个基于QWidget的菜单,附加到QGraphicsView。
  2. 创建您自己的菜单项,该菜单项从QGraphicsItem派生。

尽管第二种方法会花费更多时间,但我认为它可能是一个更好的系统,因为它将与您要删除的项目更加融合。 第一种方法也是可行的,如果它不起作用,则可以在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM