我现在真的被困住了.. 我的应用程序可以通过单击创建(动画)帧,这些帧可以移动,删除或编辑。我想要某种右键单击上下文菜单来删除它们。
我现在尝试创建一个QListWidget,并在其中插入QListWidgetItems(帧)。我可以将这些物品放在那里,但当然我不知道如何存储这些物品。
我尝试创建一个新类,派生自QListWidgetItem,如下所示:
#pragma once
#include <qobject.h>
#include <QtGui>
#include <Frame.h>
class FrameItem : public QListWidgetItem
{
public:
FrameItem();
Frame frame;
void setFrame(Frame f);
Frame getFrame();
int id;
void setId(int id);
int getId();
};
这实际上可行,但itemClicked()信号不再触发。
void itemClicked(QListWidgetItem* item)
{
std::cout << item->text().toStdString() << std::endl;
};
如果我将itemClicked(QListWidgetItem * item)的参数更改为itemClicked(FrameItem * item),则信号不会再触发。
我是否需要覆盖itemClicked()插槽?如果有,怎么样? 是否有更好的方法来存储大量数据,并为它们提供右键单击上下文菜单?
答案 0 :(得分:3)
当前插槽的参数必须与信号的参数匹配。因此,您无法使用带有FrameItem
参数的插槽。使用此:
void itemClicked(QListWidgetItem* item) {
FrameItem* frameItem = static_cast<FrameItem*>(item);
//...
}
您需要将QListWidgetItem
投射到FrameItem
。只有在您确定它是FrameItem
对象时才允许这样做。您无法使用qobject_cast
,因为QListWidgetItem
未继承QObject
,但使用static_cast
代替reinterpret_cast
仍然更好。如果您只在列表中插入FrameItem
项,那就没问题。在其他情况下,完美的选择是dynamic_cast
,因为如果对象实际上不是FrameItem
,它将返回空指针。但如果使用动态链接,它可能无法正常工作。
除此之外,不建议继承QListWidgetItem
。正如the documentation所述,QListWidget::setItemWidget
应该用于使用自定义窗口小部件显示静态内容,而QListView
和QItemDelegate
应该用于更复杂的情况。
答案 1 :(得分:1)
如果更改功能签名,信号将不会触发。解决方案要简单得多,只需接收一个QListWidgetItem *并将其重新解释为一个FrameItem。
只要你不在列表中插入任何不是FrameItem的东西,你就会安全。