【问题标题】:Implementing a custom QListWidgetItem?实现自定义 QListWidgetItem?
【发布时间】:2013-06-05 07:55:14
【问题描述】:

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

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

【问题讨论】:

    标签: c++ qt user-interface mouseevent right-click


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      如果您更改函数签名,信号将不会触发。解决方案要简单得多,只需接收一个 QListWidgetItem * 并将其重新解释为 FrameItem。

      只要您从不在列表中插入任何不是 FrameItem 的内容,您就会安全。

      【讨论】:

      • 像这样 ?connect(listWidget,SIGNAL(itemClicked(QListWidgetItem*)),this,SLOT(itemClicked(QListWidgetItem*)));在插槽中: FrameItem* fi= reinterpret_cast(&item);
      • @Amazonasmann:就是这样,只是你不应该使用项目的地址:FrameItem* fi = reinterpret_cast(Item);
      • 好的,现在我可以访问 FrameItem 的功能了。但是,item->setText() 工作得很好...但是当我执行 item->setId(20) 并在slot 我做了一个 item->getId() 结果不是 20 而是 -1414812757 ..有什么想法吗?
      • @Amazonasmann 您的setId(int id) 函数是否为正确的变量赋值?
      • 也许我真的应该做一个 qobject_cast ?但我还不知道该怎么做... qobject_cast(item) 不起作用...
      猜你喜欢
      • 2019-03-02
      • 2014-02-01
      • 2014-10-14
      • 2011-06-04
      • 2010-10-29
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多