首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现自定义QListWidgetItem?

实现自定义QListWidgetItem?
EN

Stack Overflow用户
提问于 2013-06-05 15:55:15
回答 2查看 3.1K关注 0票数 2

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

我现在的尝试是创建一个QListWidget,并在其中插入QListWidgetItems (框架)。我可以把这些项目放在那里,但我当然不知道如何存储帧。

我尝试创建一个新类,派生自QListWidgetItem,如下所示:

代码语言:javascript
复制
    #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()信号不再触发。

代码语言:javascript
复制
void itemClicked(QListWidgetItem* item)
{   
    std::cout << item->text().toStdString() << std::endl;
};

如果我将itemClicked(QListWidgetItem* item)的参数更改为itemClicked(FrameItem* item),信号将不再触发。

我需要覆盖itemClicked()插槽吗?如果是,是如何实现的?有没有更好的方法来存储大量数据,并给它们一个右键单击上下文菜单?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-05 16:47:00

当前槽的参数必须与信号的参数匹配。因此,您不能使用带有FrameItem参数的插槽。使用以下命令:

代码语言:javascript
复制
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应该用于使用自定义小部件显示静态内容,而QListViewQItemDelegate应该用于更复杂的情况。

票数 3
EN

Stack Overflow用户

发布于 2013-06-05 16:00:50

如果你改变函数签名,信号将不会被触发。解决方案要简单得多,只需接收QListWidgetItem *并将其reinterpret_cast到FrameItem即可。

只要你不在列表中插入任何不是FrameItem的东西,你就是安全的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16934423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档