实现自定义QListWidgetItem?

时间:2013-06-05 07:55:15

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

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

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

2 个答案:

答案 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应该用于使用自定义窗口小部件显示静态内容,而QListViewQItemDelegate应该用于更复杂的情况。

答案 1 :(得分:1)

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

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