Я действительно застрял на данный момент ..
Мое приложение может создавать (анимацию) кадры одним нажатием, эти кадры можно перемещать, удалять или редактировать. Я хочу щелкнуть правой кнопкой мыши контекстное меню, чтобы удалить их.
Сейчас я пытаюсь создать 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 ()? Если да, то как?
Существует ли лучший подход для хранения большого количества данных и предоставления им контекстного меню, вызываемого правой кнопкой мыши?
Аргументы текущего слота должны соответствовать аргументам сигнала. Таким образом, вы не можете использовать слот с 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
следует использовать в более сложных случаях.
Если вы измените сигнатуру функции, сигнал не сработает. Решение намного проще, просто получите QListWidgetItem * и повторно интерпретируйте его в FrameItem.
Пока вы НИКОГДА не вставляете в список ничего, что не является FrameItem, вы будете в безопасности.