python 导航栏

# -*- coding: utf-8 -*-#

#-------------------------------------------------------------------------------
# Name:         导航条控件
#-------------------------------------------------------------------------------

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *

class NavigationWidget(QWidget):
    currentItemChanged = pyqtSignal([int, str])
    def __init__(self, parent=None):
        super(NavigationWidget, self).__init__(parent)

        self.initUI()

    def initUI(self):
        self.backgroundColor = '#E4E4E4'
        self.selectedColor = '#2CA7F8'
        self.rowHeight = 40
        self.currentIndex = 0 #当前选择的项索引
        self.listItems = []
        self.cursorIndex = -1 #当前光标所在位置的项索引

        self.setMouseTracking(True)
        self.setMinimumWidth(120)

    def addItem(self, item):
        self.listItems.append(item)
        self.update()

    def setItems(self, items):
        self.listItems = items
        self.update()

    def setBackgroundColor(self, color):
        self.backgroundColor = color
        self.update()

    def setSelectColor(self, color):
        self.selectedColor = color
        self.update()

    def setRowHeight(self, height):
        self.rowHeight = height
        self.update()

    def setCurrentIndex(self, idx):
        self.currentIndex = idx
        self.currentItemChanged.emit(idx, self.listItems[idx])
        self.update()

    def paintEvent(self, evt):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing, True)

        #画背景色
        painter.setPen(Qt.NoPen)
        painter.setBrush(QColor(self.backgroundColor))
        painter.drawRect(self.rect())

        #画子项
        for i in range(len(self.listItems)):
            itemPath = QPainterPath()
            itemPath.addRect(QRectF(0, i*self.rowHeight, self.width()-1, self.rowHeight-1))

            if i == self.currentIndex:
                painter.setPen(QColor('#FFFFFF'))
                painter.fillPath(itemPath, QColor(self.selectedColor))
            elif i == self.cursorIndex:
                painter.setPen(QColor('#FFFFFF'))
                painter.fillPath(itemPath, QColor(self.selectedColor))
            else:
                painter.setPen(QColor('#202020'))
                painter.fillPath(itemPath, QColor(self.backgroundColor))

            painter.drawText(QRect(0, i*self.rowHeight, self.width(), self.rowHeight), Qt.AlignVCenter|Qt.AlignHCenter, self.listItems[i])

    def mouseMoveEvent(self, evt):
        idx = evt.y() / self.rowHeight
        if idx >= len(self.listItems):
            idx = -1
        if idx < len(self.listItems) and idx != self.cursorIndex:
            self.update()
            self.cursorIndex = idx

    def mousePressEvent(self, evt):
        idx = evt.y()/self.rowHeight
        if  idx< len(self.listItems):
            self.currentIndex = idx
            self.currentItemChanged.emit(idx, self.listItems[idx])
            self.update()

    def leaveEvent(self, QEvent):
        self.cursorIndex = -1
        self.update()


class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.initUI()

    def initUI(self):
        self.resize(600, 400)
        self.setWindowTitle(u'导航条控件')

        mainWidget = QWidget()
        self.setCentralWidget(mainWidget)

        navigationWidget = NavigationWidget()
        navigationWidget.setRowHeight(50)
        navigationWidget.setItems([u'常规', u'高级', u'管理', u'其它', u'关于'])

        self.tipsLabel = QLabel(u"请选择:")

        mainLayout = QHBoxLayout(mainWidget)
        mainLayout.setContentsMargins(0, 0, 0, 0)
        
        mainLayout.setSpacing(10)
        mainLayout.addWidget(navigationWidget, 1)
        mainLayout.addWidget(self.tipsLabel, 3, Qt.AlignCenter)

        navigationWidget.currentItemChanged[int, str].connect(self.slotCurrentItemChanged)
        navigationWidget.setCurrentIndex(2)

        self.show()

    def slotCurrentItemChanged(self, index, content):
        self.tipsLabel.setText(u"Current index and content:{} ---- {}".format(index, content))

def main():
    app = QApplication(sys.argv)
    mainWnd = MainWindow()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

python 导航栏_第1张图片

你可能感兴趣的:(python,PyQt4,Gui)