Figured another one out thanks to Stackoverflow.
https://stackoverflow.com/questions/43454882/paint-over-qlabel-with-pyqt
My paintEvent was done on QWidget, which was behind QLabel. Once the QLabel
got stylesheet'd it covered up my image I suppose. So paintEvent needed to
be implemented on the QLabel instead.
Attached is a working code. Not sure how many methods I should keep in
QWidget class vs move to QLabel class but here is what I have.
Next step I'll try out QPixmapCache.
--
You received this message because you are subscribed to the Google Groups
"Python Programming for Autodesk Maya" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/python_inside_maya/5cc937ea-b3a3-4d66-ac71-2f5981ae20d5%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
# -*- coding: utf-8 -*-
import sys
from os import environ
from os.path import dirname, realpath, join, isfile
import qdarkstyle
from PySide import QtCore
from PySide.QtGui import (QApplication, QVBoxLayout, QLabel, QPixmap, QWidget,
QPainter)
environ['QT_API'] = 'pyside'
class ScrubbaleWidget(QWidget):
""" Exercize. A widget that users can scrub to play the turntable image
sequence.
Args:
images (str list): Full path to sequential images.
scrub_threshold (int): Scrub distance for image change.
Attributes:
disable (bool): stop the Widget from doing anything
tracking (bool): A switch to tell Widget when to track mouse movement.
mouse_start (float): Mouse starting X position.
"""
def __init__(self, images=None, scrub_threshold=30, parent=None):
super(ScrubbaleWidget, self).__init__(parent)
self.setMinimumSize(100, 50)
self.resize(250, 200)
self.scrub_threshold = scrub_threshold
self.disable = False
self.tracking = False
self.mouse_start = 0
self.label = ImageSequenceLabel()
self.label.setAlignment(QtCore.Qt.AlignCenter)
layout = QVBoxLayout()
layout.setContentsMargins(10, 10, 10, 10)
layout.addWidget(self.label)
self.setLayout(layout)
pics = []
default_img = join(dirname(realpath(__file__)), 'mystery2.png')
if not images or not isinstance(images, list):
self.disable = True
self.label.set_opacity(0.2)
pics.append(default_img)
else:
for image in images:
if not isfile(image):
pics.append(default_img)
else:
pics.append(image)
self.label.set_pics(pics)
def mousePressEvent(self, event):
if self.disable:
return
if event.button() == QtCore.Qt.LeftButton:
self.mouse_start = event.x()
self.tracking = True
def mouseReleaseEvent(self, event):
if self.disable:
return
if event.button() == QtCore.Qt.LeftButton:
self.tracking = False
def mouseMoveEvent(self, event):
if self.disable:
return
if not self.tracking:
return
distance = self.mouse_start - event.x()
if distance >= self.scrub_threshold:
self.mouse_start = event.x()
self.label.index_step(1)
elif distance <= -self.scrub_threshold:
self.mouse_start = event.x()
self.label.index_step(-1)
class ImageSequenceLabel(QLabel):
def __init__(self, parent=None):
super(ImageSequenceLabel, self).__init__(parent=parent)
self.pics = []
self.pic_index = 0
self.pic_opacity = 1.0
def set_pics(self, images):
self.pics = []
default_img = QPixmap(join(dirname(realpath(__file__)), 'mystery2.png'))
if images is None or not isinstance(images, list):
self.pics = [default_img]
else:
for img in images:
if isfile(img):
self.pics.append(QPixmap(img))
if not self.pics:
# In case none of the image sequence exists
self.pics = [default_img]
def set_opacity(self, opacity=1.0):
self.pic_opacity = opacity
def index_step(self, step=1):
# update and loop the image index
if len(self.pics) == 0:
return
self.pic_index += step
if self.pic_index >= len(self.pics):
self.pic_index = 0
elif self.pic_index < 0:
self.pic_index = len(self.pics) - 1
self.repaint()
def paintEvent(self, e):
super(ImageSequenceLabel, self).paintEvent(e)
if not self.pics:
return
painter = QPainter()
painter.begin(self)
painter.setOpacity(self.pic_opacity)
scaled_pic = self.pics[self.pic_index].scaled(
self.width(), self.height(),
QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)
x_offset = (self.width() - scaled_pic.width()) / 2
y_offset = (self.height() - scaled_pic.height()) / 2
painter.drawPixmap(x_offset, y_offset, scaled_pic)
painter.end()
if __name__=='__main__':
# Passing list of example images as argument.
current_path = dirname(realpath(__file__))
images = []
for i in range(1,8):
images.append('%s/turn%s.jpg' % (current_path, i))
app = QApplication(sys.argv)
SCRUB = ScrubbaleWidget(images)
# SCRUB = ScrubbaleImageSequenceWidget('random string')
app.setStyleSheet(qdarkstyle.load_stylesheet_pyside())
SCRUB.show()
sys.exit(app.exec_())