Я довольно новичок в Qt и C ++ (работаю над C # и Java всю свою жизнь) и почти везде читал, что не должен больше использовать необработанные указатели (кроме тех, что в конструкторах и деструкторах, следуя принципу RAII).
Я в порядке, но есть проблема, которую я не могу легко решить без указателей.
Я попытаюсь объяснить мою проблему.
Я создаюQList созданного мной пользовательского класса (MyClass), который будет служить моделью для моего приложения:
QList<MyClass> modelList;
Этот QList обновляется (элементы добавляются, удаляются или обновляются) рабочим потоком на основеинформации, поступающей из сети.
Пока все хорошо.
Теперь у меня есть еще один поток (GUI), в котором есть QList рисованных элементов (MyDrawableItem).Каждый из этих элементов имеет член, который должен указывать на один из элементов в первом QList (modelList), например:
QList<MyDrawableItem> listToDraw;
где:
class MyDrawableItem
{
private:
MyObject *pointedObject;
//List of many other members related to drawing
}
, потому что каждый раз таймерв потоке GUI истекает, я должен обновить связанные элементы рисования на основе указанного объекта.Необходимо отметить, что безопасно хранить указатель на члены QList, как указано в документации:
Примечание: итераторы в QLinkedList и ссылки на QList-ы, выделяющие кучу, остаются действительными до тех пор, пока ссылочные элементыоставаться в контейнере.Это не верно для итераторов и ссылок на QVector и QLists без выделения кучи.
Внутренне, QList представляется как массив T, если sizeof (T) <= sizeof (void *) и T имеетбыло объявлено либо Q_MOVABLE_TYPE, либо Q_PRIMITIVE_TYPE с использованием Q_DECLARE_TYPEINFO.В противном случае QList представляется в виде массива T *, а элементы располагаются в куче. </p>
Как это возможно без использования указателей?Или, что еще лучше, каким должен быть наилучший способ выполнения такой работы?
Я нашел три возможных решения:
Вместо того, чтобы сохранятьPointObject в качестве члена MyDrawableItem, сохраняйтеиндекс указанного объекта в modelList.Затем по обновлению зайдите внутрь QList.Но что, если элемент в списке будет удален?Я мог бы сигнализировать об этом, но если обновление произойдет до того, как слот будет вызван?
Ничего не сохранять в качестве члена и подключить два сигнала к MyDrawableItem.Один сигнал updateDrawing(const MyObject&)
обновляет элементы, относящиеся к рисованию, а другой сигнал removeDrawing()
просто удаляет объект.Таким образом, мне не нужно беспокоиться о синхронизации между потоками, потому что объект MyDrawableItem никогда не будет смотреть на содержимое QList.В этом случае я мог бы обновлять элемент очень часто с большим количеством сигналов, в то время как я хочу обновлять GUI только время от времени (таймер 500 мс).
Просто используйте указатели.
Развивайте и используйте QSharedPointers, но я никогда не использовал их, и я не знаю, является ли это лучшим вариантом.
Я думаю, чтони одно из этих решений не является идеальным, поэтому я здесь прошу вашей помощи.
Как стандартные представления в Qt (просмотр таблицы, просмотр списка и т. д.) решают эту проблему?
КакДолжен ли я с этим справиться?
Пожалуйста, помогите мне, я думаю об этом со вчерашнего дня, и я не хочу наводить беспорядок.
Спасибо большое!