PyQt写的图片浏览器,PyQt写图片浏览器,开发环境: CentOS


开发环境: CentOS6.4

运行环境: Python 2.6 PyQt4

# -*- coding: utf-8 -*-#! /usr/bin/env pythonimport sysfrom PyQt4 import QtGui, QtCoreimport os, stringimport mathTHUMB_WIDTH = 128THUMB_HEIGHT = 128THUMB_MIN = 64THUMB_MAX = 256FILE_TYPE = ['jpg', 'jpeg', 'tif', 'bmp', 'gif']class ImageWidget(QtGui.QWidget):    #单选,上一个被选择的对象    prevSelected = None    """    Use this widget to display image.    """    def __init__(self):        super(ImageWidget, self).__init__()        self.id = 0        self.displayText = ''      #显示的文字        self.version = ''        self.status = 0        self.path = ''        self.showStatus = True        self.selected = False        self.isHightlight = False        self.thumb = QtGui.QImage()        self.initAttrib()    def initAttrib(self):        self.name_font = QtGui.QFont()        self.bg_color = QtGui.QColor(50, 50, 50)        self.hightlight = QtGui.QColor(255, 255, 255, 100)        self.edge_size = 5        self.pen_selected = QtGui.QPen(QtGui.QColor(255, 255, 0))        self.pen_selected.setWidth(self.edge_size)         self.pen_selected.setJoinStyle(QtCore.Qt.MiterJoin)#        self.setToolTip('aaaa\\nbbbb\\ncccc')    def assetFile(self):        return self.path + "_asset_.txt"    def thumbFile(self):        return self.path + "_thumb_.png"    def informationFile(self):        return self.path + "_information_.txt"    def getPublishPath(self):        current_version = self.version        if not current_version:            current_version = '000'        new_version = int(string.atof(current_version)) + 1        return '%s/%03d' % (self.path, new_version)    def getVersionPath(self, version):        return '%s/%s' % (self.path, version)    def getCurrentVersionPath(self):        return self.getVersionPath(self.version)    def setThumb(self, thumb = None):        if not thumb:            thumb = self.thumbFile()        if os.path.isfile(thumb):            self.thumb.load(QtCore.QString(thumb))            self.repaint()            return True    def paintAsThumb(self, painter):        name_height = max(self.height() * 0.15, 20)        name_ty = self.height() - self.edge_size * 2        # draw background        painter.fillRect(self.rect(), self.bg_color)        painter.drawImage(self.rect(), self.thumb)        # draw hightlight        if self.isHightlight and not self.selected:            painter.fillRect(self.rect(), self.hightlight)        # draw name        painter.setPen(QtGui.QPen(QtGui.QColor(255, 255, 255)))        self.name_font.setPixelSize(name_height)        painter.setFont(self.name_font)        #脚标字符        painter.drawText(self.edge_size, name_ty, str(self.displayText))        if self.status:            title_height = self.edge_size + name_height            p1 = QtCore.QPoint(0, 0)            p2 = QtCore.QPoint(0, title_height)            p3 = QtCore.QPoint(title_height, 0)            painter.setPen(QtCore.Qt.NoPen)            painter.fillRect(0, 0, self.width(), title_height, QtGui.QColor(40, 40, 40, 40))            if self.status == 1:                painter.setBrush(QtGui.QBrush(QtGui.QColor(255, 0, 0)))            elif self.status == 2:                painter.setBrush(QtGui.QBrush(QtGui.QColor(0, 255, 0)))            elif self.status == 3:                painter.setBrush(QtGui.QBrush(QtGui.QColor(0, 0, 255)))            painter.drawConvexPolygon(p1, p2, p3)        if self.version:            version_x = self.width() - self.edge_size - name_height * 1.5            version_y = name_height            painter.setPen(QtGui.QPen(QtGui.QColor(255, 255, 255)))            painter.drawText(version_x, version_y, '%s' % self.version)        # draw selected        if self.selected:            painter.setPen(self.pen_selected)            painter.setBrush(QtCore.Qt.NoBrush)            painter.drawRect(self.edge_size/2, self.edge_size/2,\\                self.width() - self.edge_size, self.height() - self.edge_size)    def paintEvent(self, event):        painter = QtGui.QPainter(self)        self.paintAsThumb(painter)    def mouseReleaseEvent(self, event):        if event.button() == QtCore.Qt.LeftButton:            self.setSelected()    def mouseDoubleClickEvent(self, event):        self.emit(QtCore.SIGNAL('doubleClick'))    def enterEvent(self, event):        self.isHightlight = True        self.repaint()    def leaveEvent(self, event):        self.isHightlight = False        self.repaint()    #设定当前为选中状态    def setSelected(self):        #取消其他缩略图的选择状态, 当前设为选择状态        if ImageWidget.prevSelected != None:            ImageWidget.prevSelected.selected = False            ImageWidget.prevSelected.repaint()        self.selected = True        self.repaint()        ImageWidget.prevSelected = self        self.onWidgetClicked()        self.emit(QtCore.SIGNAL("click"), self.id)    def onWidgetClicked(self):        print 'on widget clicked'class ImageContainer(QtGui.QFrame):    def __init__(self, widgets = None):        super(ImageContainer, self).__init__()        containerLayout = QtGui.QVBoxLayout()        #初始化Slider        self.zoomSlider = QtGui.QSlider()        self.zoomSlider.setOrientation(QtCore.Qt.Horizontal)        self.zoomSlider.setMinimum(THUMB_MIN)        self.zoomSlider.setMaximum(THUMB_MAX)        self.zoomSlider.setValue(THUMB_WIDTH)        self.zoomSlider.setFixedWidth(128)        self.zoomSlider.setFixedHeight(10)        #Slider设定        QtCore.QObject.connect(self.zoomSlider, QtCore.SIGNAL('valueChanged(int)'), self.setItemSize)        self.item_scrollarea = QtGui.QScrollArea()        self.item_area = QtGui.QWidget()        self.item_scrollarea.setWidget(self.item_area)        containerLayout.addWidget(self.zoomSlider)        containerLayout.addWidget(self.item_scrollarea)        self.widget_w = THUMB_WIDTH        self.widget_h = THUMB_HEIGHT        self.min_width = THUMB_MIN        self.max_height = THUMB_MAX        self.asset_space = 2        self.auto_space = False        self.setWindowOpacity(0.0)        self.setLayout(containerLayout)        #缩略图对象列表        self.ImageWidgetList = {}    def addWidget(self, widget):        widget.setParent(self.item_area)        widget.resize(self.widget_w, self.widget_h)        widget.show()        #添加到列表        self.ImageWidgetList[str(widget.id)] = widget    def addWidgets(self, widgets):        for widget in widgets:            self.addWidget(widget)        self.layout()    def clearAll(self):        widgets = self.item_area.children()        if widgets:            for widget in widgets:                widget.setParent(None)        self.ImageWidgetList.clear()    def layout(self):        w = self.width() - 20        widgets = self.item_area.children()        num_x = max(math.ceil(w / (self.widget_w + self.asset_space)), 1)  # Can do -1        num_y = math.ceil(len(widgets) / num_x)        self.item_area.resize(w, num_y * (self.widget_h + self.asset_space) + 50)        main_w = self.item_area.width()        main_h = self.item_area.height()        num_x = max(math.ceil(main_w / (self.widget_w + self.asset_space)), 1)  # Can do -1        x = 0        y = 0        for i in range(len(widgets)):            space_x = 0            if self.auto_space:                space_x = (main_w - self.asset_space * 2 - num_x * (self.widget_w + self.asset_space)) / num_x            widgets[i].move(self.asset_space * 2 + x * (self.widget_w + self.asset_space + space_x), \\                self.asset_space*2 + y * (self.widget_h + self.asset_space))            x += 1            if x >= num_x:                x = 0                y += 1    def resizeEvent(self, event):        self.layout()    def changeItemSize(self, mount):        widgets = self.item_area.children()        self.widget_w += mount        if self.widget_w > self.max_height:            self.widget_w = self.max_height        elif self.widget_w < self.min_width:            self.widget_w = self.min_width        self.widget_h += mount        if self.widget_h > self.max_height:            self.widget_h = self.max_height        elif self.widget_h < self.min_width:            self.widget_h = self.min_width        for a in widgets:            a.resize(self.widget_w, self.widget_h)        self.layout()    def setItemSize(self, size):        widgets = self.item_area.children()        self.widget_w = size        self.widget_h = size        for a in widgets:            a.resize(size, size)        self.layout()    #设定指定id为选中状态    def setSelected(self, id):        print 'ImageContainer -> setSelected    ', id        self.ImageWidgetList[str(id)].setSelected()class MainWindow(QtGui.QWidget):        def __init__(self):        app = QtGui.QApplication(sys.argv)        super(MainWindow, self).__init__()        self.setWindowTitle("Image Viewer")        self.resize(1280,800)        #屏幕居中        self.screen = QtGui.QDesktopWidget().screenGeometry()        self.size = self.geometry()        self.move((self.screen.width()-self.size.width())/2, (self.screen.height()-self.size.height())/2)        self.show()        mainSpliter = QtGui.QSplitter(QtCore.Qt.Horizontal)        #文件夹列表model        self.dirModel = QtGui.QDirModel(self)        #只显示文件夹        self.dirModel.setFilter(QtCore.QDir.Dirs|QtCore.QDir.NoDotAndDotDot)        #文件夹列表view        self.dirTreeView = QtGui.QTreeView()        #绑定model        self.dirTreeView.setModel(self.dirModel)        self.dirTreeView.hideColumn(1)        self.dirTreeView.hideColumn(2)        self.dirTreeView.hideColumn(3)        #DirTree事件响应        self.dirTreeView.selectionModel().selectionChanged.connect(self.dirTreeClicked)        mainLayout = QtGui.QVBoxLayout()        mainSpliter.addWidget(self.dirTreeView)        self.imageContainer = ImageContainer(mainSpliter)#        self.imageContainer.setGeometry(self.imageContainer.geometry().x(), self.imageContainer.geometry().y(), 100, self.imageContainer.geometry().height())        self.imageContainer.setMinimumWidth(self.geometry().width()*0.7)        mainSpliter.addWidget(self.imageContainer)        mainLayout.addWidget(mainSpliter)        self.setLayout(mainLayout)        sys.exit(app.exec_())    def dirTreeClicked(self):        print 'dirTreeClicked'        self.imageContainer.clearAll()        #获取选择的路径        pathSelected = self.dirModel.filePath(self.dirTreeView.selectedIndexes()[0])        print 'pathSelected   ', pathSelected        #遍历路径下的媒体文件        for item in os.listdir(pathSelected):            if item.split('.')[-1] in FILE_TYPE:                print item                #添加widget                try:                    widget = ImageWidget()                    widget.displayText = item                    widget.setThumb(unicode(pathSelected +'/' + item))                    self.imageContainer.addWidget(widget)                except:                    pass#        self.imageContainer.layout()def main():        MainWindow()if __name__ == '__main__':    main()#该片段来自于http://byrx.net

评论关闭