gpt4 book ai didi

c++ - 从 QGraphicsScene 中删除 QGraphicsItem/QGraphicsObject?

转载 作者:行者123 更新时间:2023-11-30 05:40:06 26 4
gpt4 key购买 nike

我已经创建了 Qt GUI 应用程序。它由 QGraphicsScene 组成,并且通过按下或触发 pushbutton 将项目(QGraphicsItem)添加到其中。添加到场景中的每个项目都是派生自 QGraphicsItem 的不同类的成员。现在,我的挑战是通过以下机制之一从场景中删除添加的项目:

1) 右键单击​​添加的项目,创建上下文菜单,然后使用 场景->removeItem(addedItem);

2) 双击删除项目

3) 使用标志ItemIsSelectable选择一个项目,然后按键盘上的delete键删除该项目

但话虽如此,作为 Qt 的新手,我无法执行第 1 项,因为右键单击时上下文菜单不显示。在第 2 种情况下,我使用了信号和槽,只要双击一个项目就会发出一个信号,mainWindow 中的一个槽吸收信号并删除该项目。但是这样,当我将 Q_OBJECT 宏添加到项目类的头文件时,由于错误“找到重复的符号”,程序无法编译。

所以我最后的选择是在屏幕上选择一个项目,然后通过按删除键发出键盘信号来删除该项目。这怎么能做到呢?如果上述任何方法可以轻松完成,请给我建议,以防我可能完全错误地做。

附言:我知道有很多关于从 QGraphicsScene 中删除 QGraphicsItem 的问题,但没有一个提供可靠的答案。

最佳答案

... I'm unable to do number 1 since the context menu doesn't show up when right clicked.

有两种可能的方法来实现这一点:

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

虽然第二种方法会花费更多时间,但在我看来它可能是一个更好的系统,因为它会感觉与您在场景中删除的项目更加融合。第一种方法也是可行的,如果它不起作用,那么您可以在 SO 上发布示例问题。

2, I used signals and slots, ... because of the error "duplicate symbol found" when I add a Q_OBJECT macro to the header file

听起来您正在尝试将信号/槽功能添加到从 QGraphicsItem 派生的类中。你不需要这样做。 Qt 提供了 QGraphicsObject如果您想要 QGraphicsScene 中的项目上的信号和插槽,您可以从该类而不是 QGraphicsItem 派生。

propane the keyboard signal to delete the item by pressing 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;
}
}
}

关于c++ - 从 QGraphicsScene 中删除 QGraphicsItem/QGraphicsObject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31905718/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com