ОП предоставил правильное исправление в своем самоответе , но упустил объяснение, почему это необходимо. Итак, я вступлю:
Qt Doc. о QImage::QImage()
:
Создает изображение с заданной шириной, высотой и форматом.
Нулевое изображение будет возвращено, если память не может быть выделена.
Предупреждение: это создаст QImage с неинициализированными данными. Вызовите fill () , чтобы заполнить изображение соответствующим значением пикселя, прежде чем рисовать на нем с помощью QPainter.
(Подчеркните мое.)
Неинициализированный означает, что может быть любое значение в байтах пикселя изображения. Если бы это были все 0
с, значения альфа также были бы 0
с. Это может объяснить, почему ничего не появилось.
Теперь еще одно примечание, почему это могло работать в режиме отладки:
OP упоминается явно MSVC. Ребята из MS постарались обеспечить лучшую поддержку для отладки и решили заполнить каждую выделенную память (в режиме отладки) шаблонами, например CD
означает «выделено, но еще не инициализировано». (Подробнее об этом здесь: SO: Что такое представления выделения памяти в Visual Studio C ++? .)
Иногда это действительно полезно. Интерпретация этого битового шаблона как float
или double
приводит к довольно странным числам (легко распознаваемым с небольшим опытом), и целочисленные значения в шестнадцатеричном представлении становятся совершенно очевидными.
Однако у этого есть некоторые недостатки: неинициализированный bool
всегда будет "инициализирован" в true
в режиме отладки (каким-то образом), где он имеет произвольные значения в выпуске. & Rarr; Самая страшная авария: отладка запускается, но выпуск происходит не всегда. (Мои самые ошибочные ошибки.)
В случае OP это (вероятно) похоже: в режиме отладки изображение всегда имеет светло-серый фон с непрозрачностью, которая достаточно высока, чтобы игнорировать неожиданную прозрачность в режиме выпуска ... см. Выше. (В качестве альтернативы, ОП мог получить шумовую картину, такую же, как известную по телевидению после полуночи в прошлом. Не уверен, помогло ли это в дальнейшем ...)