class ResizableImage(QLabel): def __init__(self, filename, height, min_scale, max_scale): super(ResizableImage, self).__init__() self.setAlignment(Qt.AlignCenter) self.full_pixmap = None self.scaled_pixmap = None self.aspect = None self.set_file(filename) self.set_height(height) self.min_height = self.full_pixmap.height() * min_scale * self.aspect self.min_width = self.full_pixmap.width() * min_scale / self.aspect self.max_height = self.full_pixmap.height() * max_scale * self.aspect self.max_width = self.full_pixmap.width() * max_scale / self.aspect def set_file(self, filename): self.full_pixmap = QPixmap(filename) self.aspect = float(self.full_pixmap.height()) / self.full_pixmap.width() if self.scaled_pixmap is not None: self.set_height(self.scaled_pixmap.height()) def set_height(self, height): self.scaled_pixmap = self.full_pixmap.scaledToHeight(height, Qt.SmoothTransformation) self.setPixmap(self.scaled_pixmap) def set_width(self, width): self.scaled_pixmap = self.full_pixmap.scaledToWidth(width, Qt.SmoothTransformation) self.setPixmap(self.scaled_pixmap) def resizeEvent(self, ev): width, height = ev.size().width(), ev.size().height() label_aspect = height / width if label_aspect > self.aspect: self.set_width(min(max(.9 * width, self.min_width), self.max_width)) else: self.set_height(min(max(.9 * height, self.min_height), self.max_height))
def updateScreen(self, filename, xmlPath, x=0, y=0, w=0, h=0, reloadMode=False): """ Update the screen """ self.imagePath = filename if not reloadMode: self.tableModel.mylist = [] self.tableModel.beginResetModel() self.tableModel.endResetModel() pixmap = QPixmap(filename) if pixmap is not None: self.origWidth = pixmap.width() self.origHeight = pixmap.height() self.screenResolutionLabel.setText( "Resolution=%sx%s" % (self.origWidth, self.origHeight)) #portrait if self.origWidth < self.origHeight: pixmap = pixmap.scaledToHeight(Settings.getInt( 'MobileAndroid', 'resolution-screen-height'), mode=Qt.SmoothTransformation) self.mobileImageLabel.setPixmap(pixmap) else: pixmap = pixmap.scaledToWidth(Settings.getInt( 'MobileAndroid', 'resolution-screen-width'), mode=Qt.SmoothTransformation) self.mobileImageLabel.setPixmap(pixmap) self.drawRectangle(x=x, y=y, w=w, h=h) self.resize(pixmap.width(), pixmap.height()) # convert xml to dict if len(xmlPath): f = QFile(xmlPath) if f.open(QIODevice.ReadOnly): document = QDomDocument() if document.setContent(f): newModel = DomModel(document, self) self.mobileTreeView.setModel(newModel) self.mobileTreeView.expandAll() self.mobileTreeView.resizeColumnToContents(0) f.close()
class FieldItemGraphicsPixmapItem(QGraphicsPixmapItem): """this class provides a pixmap item with a preset image for the item""" #constructor def __init__(self, graphics_list): super().__init__() self.available_graphics = graphics_list self.current_graphic = QPixmap(self.available_graphics[0]) self.setPixmap(self.current_graphic.scaledToWidth(25,1)) self.setFlag(QGraphicsItem.ItemIsMovable) #allow us to move the graphic in the scene def update_status(self): pass
class FieldItemGraphicsPixmapItem(QGraphicsPixmapItem): """this class provides a pixmap item with a preset image for the item""" #constructor def __init__(self, graphics_list): super().__init__() self.available_graphics = graphics_list self.current_graphic = QPixmap(self.available_graphics[0]) self.setPixmap(self.current_graphic.scaledToWidth(25, 1)) self.setFlag(QGraphicsItem.ItemIsMovable ) #allow us to move the graphic in the scene def update_status(self): pass
def _createLayout(self): l = QVBoxLayout() l.setContentsMargins(0, 0, 0, 0) l.addWidget(self.warning_label) logo = QLabel(self) pix = QPixmap(resource_path('images/logo.png')) pix = pix.scaledToWidth(400, Qt.SmoothTransformation) logo.setPixmap(pix) l.addWidget(logo) l.addWidget(self.widgets, 1) self.setLayout(l)
def __init__(self, owner=None): super(ScanWizard, self).__init__(owner) self.__document_name = None # self.setOption(QWizard.NoBackButtonOnStartPage) self.setOptions(QWizard.NoDefaultButton | QWizard.NoBackButtonOnStartPage | QWizard.NoCancelButton) self.mode = ScanningMode.SHOW_INTRO self.geo = GeometryHelper() self.setOption(QWizard.HaveHelpButton, False) wavePixmap = QPixmap(":/icons/icons/wave.png") self.setPixmap(QWizard.BackgroundPixmap, wavePixmap.scaledToWidth(160, Qt.SmoothTransformation)) # wizard pages self.introPage = InstructionsWidget() self.createNewScanPage = CreateNewScanWidget() self.firstScanProgressPage = ScanningProgressWizpage(True) self.secondScanProgressPage = ScanningProgressWizpage(False) self.scanningCompleteInstallNow = ScanningCompleteInstallNowWidget() self.listOfExistingScans = ListOfExistingScanFilesWidget() self.compareTwoScans = CompareTwoScansWidget() self.selectExportType = SelectExportTypeWidget() self.exportDataPage = ExportDataWidget() self.setPage(WizardPage.INTRO, self.introPage) self.setPage(WizardPage.CREATE_NEW, self.createNewScanPage) self.setPage(WizardPage.LIST_OF_EXISTING_SCANS, self.listOfExistingScans) self.setPage(WizardPage.COMPARE_TWO_SCANS, self.compareTwoScans) self.setPage(WizardPage.SELECT_EXPORT_TYPE, self.selectExportType) self.setPage(WizardPage.EXPORT_DATA, self.exportDataPage) self.introPage.beforeInstalling.connect(self.onNewScan) self.introPage.afterInstalling.connect(self.onSelectExistingScan) # self.__current_anim = None # hook 'next/continue' button, so if its hit on page 1 - we can quit self.button(QWizard.NextButton).clicked.connect(self.onNextButtonHit) self.currentIdChanged.connect(self.onPageChanged) # self.setWizardStyle(QWizard.ModernStyle) self.setStartId(WizardPage.INTRO)
def __init__(self, owner = None): super(ScanWizard, self).__init__(owner) self.__document_name = None #self.setOption(QWizard.NoBackButtonOnStartPage) self.setOptions(QWizard.NoDefaultButton | QWizard.NoBackButtonOnStartPage | QWizard.NoCancelButton) self.mode = ScanningMode.SHOW_INTRO self.geo = GeometryHelper() self.setOption(QWizard.HaveHelpButton, False) wavePixmap = QPixmap(":/icons/icons/wave.png") self.setPixmap(QWizard.BackgroundPixmap, wavePixmap.scaledToWidth(160, Qt.SmoothTransformation)) # wizard pages self.introPage = InstructionsWidget() self.createNewScanPage = CreateNewScanWidget() self.firstScanProgressPage = ScanningProgressWizpage(True) self.secondScanProgressPage = ScanningProgressWizpage(False) self.scanningCompleteInstallNow = ScanningCompleteInstallNowWidget() self.listOfExistingScans = ListOfExistingScanFilesWidget() self.compareTwoScans = CompareTwoScansWidget() self.selectExportType = SelectExportTypeWidget() self.exportDataPage = ExportDataWidget() self.setPage(WizardPage.INTRO, self.introPage) self.setPage(WizardPage.CREATE_NEW, self.createNewScanPage) self.setPage(WizardPage.LIST_OF_EXISTING_SCANS, self.listOfExistingScans) self.setPage(WizardPage.COMPARE_TWO_SCANS, self.compareTwoScans) self.setPage(WizardPage.SELECT_EXPORT_TYPE, self.selectExportType) self.setPage(WizardPage.EXPORT_DATA, self.exportDataPage) self.introPage.beforeInstalling.connect(self.onNewScan) self.introPage.afterInstalling.connect(self.onSelectExistingScan) #self.__current_anim = None # hook 'next/continue' button, so if its hit on page 1 - we can quit self.button(QWizard.NextButton).clicked.connect(self.onNextButtonHit) self.currentIdChanged.connect(self.onPageChanged) #self.setWizardStyle(QWizard.ModernStyle) self.setStartId(WizardPage.INTRO)
def paint(self, painter, option, index): filePath = self.model.filePath(index) fileName = self.model.fileName(index) r = option.rect img = QPixmap(filePath) if img.isNull(): # If not image file, try to load icon with QFileIconProvider # according to file type (extension name). # Currently not work as intended. fileInfo = self.model.fileInfo(index) icon = QFileIconProvider().icon(fileInfo) img = icon.pixmap(QSize(32, 32)) # Scale to height, align center horizontally, align bottom vertically. if img.height() > self.thumbHeight: img = img.scaledToHeight(self.thumbHeight, Qt.SmoothTransformation) if img.width() > self.thumbHeight: img = img.scaledToWidth(self.thumbHeight, Qt.SmoothTransformation) imgLeft = (self.width - img.width()) / 2 imgTop = self.thumbHeight - img.height() painter.drawPixmap(r.left() + imgLeft, r.top() + imgTop, img) rect = QRect(r.left(), r.top() + self.thumbHeight, self.width, self.nameHeight) flag = Qt.AlignHCenter | Qt.TextWrapAnywhere # get the bounding rectangle of the fileName bdRect = painter.boundingRect(rect, flag, fileName) if bdRect.height() < rect.height(): rect = bdRect if option.state & QStyle.State_Selected: painter.setBrush(self.parent().palette().highlight()) painter.drawRoundedRect(rect, 5, 5) pen = QPen(self.parent().palette().highlightedText(), 1, Qt.SolidLine) else: pen = QPen(self.parent().palette().text(), 1, Qt.SolidLine) painter.setPen(pen) painter.drawText(rect, flag, fileName)
def paint(self, painter, option, index): filePath = self.model.filePath(index) fileName = self.model.fileName(index) r = option.rect img = QPixmap(filePath) if img.isNull(): # If not image file, try to load icon with QFileIconProvider # according to file type (extension name). # Currently not work as intended. fileInfo = self.model.fileInfo(index) icon = QFileIconProvider().icon(fileInfo) img = icon.pixmap(QSize(32, 32)) # Scale to height, align center horizontally, align bottom vertically. if img.height() > self.thumbHeight: img = img.scaledToHeight(self.thumbHeight, Qt.SmoothTransformation) if img.width() > self.thumbHeight: img = img.scaledToWidth(self.thumbHeight, Qt.SmoothTransformation) imgLeft = (self.width - img.width()) / 2 imgTop = self.thumbHeight - img.height() painter.drawPixmap(r.left()+imgLeft, r.top()+imgTop, img) rect = QRect(r.left(), r.top()+self.thumbHeight, self.width, self.nameHeight) flag = Qt.AlignHCenter | Qt.TextWrapAnywhere # get the bounding rectangle of the fileName bdRect = painter.boundingRect(rect, flag, fileName) if bdRect.height() < rect.height(): rect = bdRect if option.state & QStyle.State_Selected: painter.setBrush(self.parent().palette().highlight()) painter.drawRoundedRect(rect, 5, 5) pen = QPen(self.parent().palette().highlightedText(), 1, Qt.SolidLine) else: pen = QPen(self.parent().palette().text(), 1, Qt.SolidLine) painter.setPen(pen) painter.drawText(rect, flag, fileName)
class View(QGraphicsView): fitModes = {'view_fitBest', 'view_fitWidth', 'view_fitHeight', 'view_fitSize'} def __init__(self, fileName, fitMode): super().__init__() self.setFrameShape(QFrame.NoFrame) self.fitMode = fitMode self.setBackgroundBrush(QBrush(QColor(Config.backgroundColor))) self.openFile(fileName) def openFile(self, fileName): self.oshiri = Oshiri(fileName, 'r') self.loadFonts() self.page = 0 self.display(self.oshiri.index[self.page]) def display(self, page): scene = QGraphicsScene() self.setScene(scene) self.originalImage = QPixmap() self.originalImage.loadFromData(self.oshiri.getImage(page['image'])) self.image = self.scene().addPixmap(self.originalImage) self.contents = page['contents'] self.elements = [] for item in page['contents']: shape = item['style'].get('shape', 'rectangle') shapeArgs = (item, self.image.pixmap().width(), self.image.pixmap().height()) if shape == 'ellipse': newItem = shapes.Ellipse(*shapeArgs) elif shape == 'rectangle': newItem = shapes.Rectangle(*shapeArgs) self.elements.append(newItem) self.scene().addItem(newItem) self.updateView() def resizeEvent(self, sizes): super().resizeEvent(sizes) self.updateView() def setFitMode(self, mode): self.fitMode = mode self.updateView() if self.fitMode == 'view_fitWidth': self.centerOn(0, 0) self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) else: self.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) Config.checkedActions ^= __class__.fitModes Config.checkedActions.add(self.fitMode) def scaleImage(self): self.scaledImage = self.originalImage if self.fitMode != 'view_fitSize': self.scaledImage = { 'view_fitBest': self.originalImage.scaled(self.width(), self.height(), Qt.KeepAspectRatio, Qt.SmoothTransformation), 'view_fitWidth': self.originalImage.scaledToWidth(self.width(), Qt.SmoothTransformation), 'view_fitHeight': self.originalImage.scaledToHeight(self.height(), Qt.SmoothTransformation) }[self.fitMode] self.image.setPixmap(self.scaledImage) self.imageWidth = self.image.pixmap().width() self.imageHeight = self.image.pixmap().height() def updateView(self): self.scaleImage() self.scene().setSceneRect(0, 0, self.imageWidth, self.imageHeight) for element in self.elements: element.resize(self.imageWidth, self.imageHeight) def loadFonts(self): for font in self.oshiri.getFonts(): QFontDatabase().addApplicationFontFromData(font) def previousPage(self): if self.page > 0: self.page -= 1 self.display(self.oshiri.index[self.page]) def nextPage(self): if self.page < len(self.oshiri.index) - 1: self.page += 1 self.display(self.oshiri.index[self.page])