python 导航栏_python 导航栏

这个博客介绍如何使用PyQt4库创建一个自定义的导航条控件,包括设置背景色、选中颜色、行高以及响应鼠标事件来改变当前选中的项,并通过信号传递选中项的索引和内容。
摘要由CSDN通过智能技术生成

# -*- 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()

aaaffb73b3ad8a7a7dbd33740721fa78.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值