2013-06-05 5 views
2

Я действительно застрял в данный момент. Мое приложение может создавать (анимационные) кадры щелчком, эти кадры могут быть перемещены, удалены или отредактированы. Мне нужно какое-то контекстное меню правой кнопки мыши, чтобы удалить их.Реализация пользовательского QListWidgetItem?

Моя попытка теперь создать 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 * пункт) в itemClicked (FrameItem * пункт) сигнал не срабатывает больше.

Нужно ли перезаписывать слот itemClicked()? Если да, то как? Есть ли лучший способ хранения большого количества данных и дать им контекстное меню правой кнопкой мыши?

ответ

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 следует использовать для отображения статического содержимого с использованием пользовательских виджетов, а QListView и QItemDelegate следует использовать в более сложных случаях.

+0

спасибо, это работает! – Amazonasmann

1

Если вы измените подпись функции, сигнал не будет запускаться. Решение намного проще, просто получите QListWidgetItem * и reinterpret_cast его в FrameItem.

Пока вы НИКОГДА не добавляете в список ничего, что это не FrameItem, вы будете в безопасности.

+0

qobject_cast is safe –

+0

Нравится (connect) (listWidget, SIGNAL (itemClicked (QListWidgetItem *)), это, SLOT (itemClicked (QListWidgetItem *))); и в слоте это: \t FrameItem * фи = reinterpret_cast (&item); – Amazonasmann

+0

@Amazonasmann: Вот это, только то, что вы не должны использовать адрес пункта: FrameItem * ц = reinterpret_cast (Item), –

Смежные вопросы