我现在真的被卡住了..我的应用程序可以通过单击创建(动画)帧,这些帧可以移动、删除或编辑。我想要某种右键单击上下文菜单来删除它们。
我现在的尝试是创建一个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()插槽吗?如果是,是如何实现的?有没有更好的方法来存储大量数据,并给它们一个右键单击上下文菜单?
发布于 2013-06-05 16:47:00
当前槽的参数必须与信号的参数匹配。因此,您不能使用带有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应该用于更复杂的情况。
发布于 2013-06-05 16:00:50
如果你改变函数签名,信号将不会被触发。解决方案要简单得多,只需接收QListWidgetItem *并将其reinterpret_cast到FrameItem即可。
只要你不在列表中插入任何不是FrameItem的东西,你就是安全的。
https://stackoverflow.com/questions/16934423
复制相似问题