Реализация собственного 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 * item) на itemClicked (FrameItem * item), сигнал больше не срабатывает.

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

2

Решение

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

3

Другие решения

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

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

1

По вопросам рекламы [email protected]