Ну а окно в паинтэвент не является таким же клиентом, как и внешние? Пиксмап созжается либо по внешнему запросу, либо с паинтэвента и шарится между всеми. Достаточно одного шаредпоинтера. Далее, если пикмап меняется, запрос выдает новый пиксмап, часть клиентов содержат старый, как только все запросят новый, старый автоматом освободится (не будет ссылок).
А QWeekPointer это как QPointer - пассивный наблюдатель.
С точки зрения клиента все равно как/где создан ресурс, он его использует однообразно. Также ресурс модифицируется (не константа), но не может быть сменен на другой в течение всей жизни клиента. Отличается только удаление ресурса. Псевдокод для 1 клиента
C++ (Qt)
// "посторонка" - вообще кто-то извне дал ресурс, клиент его только пользует
Client::Client( QPixmap & pm ) :
mResource(&pm),
mMode(mode_External)
{
}
// взять ресурс у окна или создать самому
Client::Client( QWidget * w, bool inPaintEvent ) :
mMode(inPaintEvent ? mode_Paint : mode_Owner)
{
mResource = inPaintEvent ? GetResFromWidget(w) : CreateOwnRes();
}
// освобождение ресурса
Client::~Client( void )
{
switch (mMode) {
case mode_External: // не мое дело, кто создал, тот и удаляет
break;
case mode_Paint: // окно должно удалить
break;
case mode_Owner:
delete mResource; // я создал, я и удаляю
}
}