我已经创建了Qt GUI应用程序。它由QGraphicsScene
组成,通过按下或触发QGraphicsItem
将项目(pushbutton
s)添加到它们中。添加到场景中的每个项目都是从QGraphicsItem
派生的不同类的成员。现在,我的挑战是通过以下机制之一删除场景中添加的项目:
1)右键单击添加的项目,创建上下文菜单,然后使用
scene->removeItem(addedItem);
2)双击删除项目的项目
3)使用标记ItemIsSelectable
选择项目,然后按键盘上的删除键删除项目
但话虽如此,作为Qt的新手,由于上下文菜单在右键单击时没有显示,我无法执行数字1。在数字2的情况下,我使用信号和插槽,每当双击项目时发出单个,并且mainWindow
中的一个插槽吸收信号并移除该项目。但是这样,由于错误"找到重复的符号"程序无法编译。当我将Q_OBJECT
宏添加到项目类的头文件中时。
所以我的最后一个选择是在屏幕上选择一个项目并按下删除键盘信号以删除项目。怎么可以这样做?如果上述任何一种方法都可以轻松完成,如果我可能完全错误,请给我建议。
P.S。 :我知道有很多关于删除QGraphicsItem
QGraphicsScene
的问题,但没有一个问题可以说明答案。
答案 0 :(得分:1)
...我无法执行数字1,因为右键单击时不会显示上下文菜单。
有两种方法可以实现这一目标:
虽然第二种方法需要花费更多时间,但在我看来,它可能是一个更好的系统,因为它会与您在场景中删除的项目更加集成。第一种方法也是可能的,如果它不起作用,那么你可以在SO上发布一个示例问题。
2,我使用信号和插槽,...因为在将Q_OBJECT宏添加到头文件时出现错误“找到重复符号”
听起来您正在尝试将信号/插槽功能添加到从QGraphicsItem派生的类中。你不需要这样做。如果你想在QGraphicsScene中的项目上有信号和插槽,Qt提供你可以派生的QGraphicsObject类,而不是QGraphicsItem。
按键删除键盘信号以删除项目。
我认为你的意思是'传播'键盘信号。通过重写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;
}
}
}
答案 1 :(得分:0)
你正在寻求很多答案,而不是如何处理QGraphicsItem或QGraphicsScene。
1)右键单击添加的项目,创建上下文菜单,然后使用scene->removeItem(addedItem);
here。
2)双击删除项目的项目 - 您需要处理双击,并对QGraphicsItem进行点击测试,您必须实施mouseDoubleClickEvent(QMouseEvent *e)
并传递e&# 39; s pos()
到this以确定是否点击了QGraphicsItem。
3)使用标记ItemIsSelectable
选择项目,然后按键盘上的删除键删除项目 - 我不确定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()的返回进行测试。