Чтобы избежать ненужных вычислений для каждого paintEvent QLabel, всякий раз, когда свойство scaledContents
имеет значение True, масштабированное изображение кэшируется, и вся картина автоматически отбрасывается.
Чтобы избежать этого, следует создать Новый экземпляр QPixmap с использованием существующего, а затем снова установите новое нарисованное растровое изображение. Обратите внимание, что если изображение масштабируется, координаты виджета не будут отражать фактическую позицию на растровом изображении, поэтому вам нужно использовать преобразование, чтобы получить фактическую точку для рисования.
def imgMousePress(self, e):
pm = QPixmap(self.imglabel.pixmap())
painter = QPainter(pm)
pen = QPen()
pen.setWidth(10)
pen.setColor(QColor('red'))
painter.setPen(pen)
transform = QTransform().scale(
pm.width() / self.imglabel.width(),
pm.height() / self.imglabel.height())
painter.drawPoint(transform.map(e.pos()))
painter.end()
self.imglabel.setPixmap(pm)
Учтите, что все «точки» станут вытянутыми прямоугольниками, если отношение ширины к высоте не совпадает с исходным изображением, но это только проблема внешнего вида: если вы сохраните растровое изображение позже, они снова будут квадратными, поскольку сохранение основано на исходное растровое изображение.
Если вы хотите сохранить их квадратную форму при отображении, вам нужно отслеживать точки и перезаписывать paintEvent, чтобы рисовать их вручную на этикетке.