gpt4 book ai didi

c++ - 实现自定义 QListWidgetItem?

转载 作者:搜寻专家 更新时间:2023-10-31 01:09:32 26 4
gpt4 key购买 nike

我现在真的卡住了..我的应用程序可以通过单击创建(动画)帧,可以移动、删除或编辑这些帧。我想要某种右键单击上下文菜单来删除它们。

我现在的尝试是创建一个 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() 插槽吗?如果是,如何?有没有更好的方法来存储大量数据,并为他们提供右键单击上下文菜单?

最佳答案

当前槽的参数必须与信号的参数相匹配。因此,您不能使用带有 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 应该用于使用自定义 Widget 显示静态内容,QListViewQItemDelegate 应该用于更复杂的情况。

关于c++ - 实现自定义 QListWidgetItem?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16934423/

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