PyQt4自定义控件----导航栏控件

PyQt4中自定义导航栏控件,运行如图所示:

代码:

  1 # -*- coding: utf-8 -*-#
  2
  3 #-------------------------------------------------------------------------------
  4 # Name:         导航条控件
  5 # Description:
  6 # Author:       lgk
  7 # Date:         2018/6/21
  8 #-------------------------------------------------------------------------------
  9
 10 import sys
 11 from PyQt4.QtGui import *
 12 from PyQt4.QtCore import *
 13
 14 class NavigationWidget(QWidget):
 15     currentItemChanged = pyqtSignal([int, str])
 16     def __init__(self, parent=None):
 17         super(NavigationWidget, self).__init__(parent)
 18
 19         self.initUI()
 20
 21     def initUI(self):
 22         self.backgroundColor = ‘#E4E4E4‘
 23         self.selectedColor = ‘#2CA7F8‘
 24         self.rowHeight = 40
 25         self.currentIndex = 0 #当前选择的项索引
 26         self.listItems = []
 27         self.cursorIndex = -1 #当前光标所在位置的项索引
 28
 29         self.setMouseTracking(True)
 30         self.setMinimumWidth(120)
 31
 32     def addItem(self, item):
 33         self.listItems.append(item)
 34         self.update()
 35
 36     def setItems(self, items):
 37         self.listItems = items
 38         self.update()
 39
 40     def setBackgroundColor(self, color):
 41         self.backgroundColor = color
 42         self.update()
 43
 44     def setSelectColor(self, color):
 45         self.selectedColor = color
 46         self.update()
 47
 48     def setRowHeight(self, height):
 49         self.rowHeight = height
 50         self.update()
 51
 52     def setCurrentIndex(self, idx):
 53         self.currentIndex = idx
 54         self.currentItemChanged.emit(idx, self.listItems[idx])
 55         self.update()
 56
 57     def paintEvent(self, evt):
 58         painter = QPainter(self)
 59         painter.setRenderHint(QPainter.Antialiasing, True)
 60
 61         #画背景色
 62         painter.setPen(Qt.NoPen)
 63         painter.setBrush(QColor(self.backgroundColor))
 64         painter.drawRect(self.rect())
 65
 66         #画子项
 67         for i in range(len(self.listItems)):
 68             itemPath = QPainterPath()
 69             itemPath.addRect(QRectF(0, i*self.rowHeight, self.width()-1, self.rowHeight-1))
 70
 71             if i == self.currentIndex:
 72                 painter.setPen(QColor(‘#FFFFFF‘))
 73                 painter.fillPath(itemPath, QColor(self.selectedColor))
 74             elif i == self.cursorIndex:
 75                 painter.setPen(QColor(‘#FFFFFF‘))
 76                 painter.fillPath(itemPath, QColor(self.selectedColor))
 77             else:
 78                 painter.setPen(QColor(‘#202020‘))
 79                 painter.fillPath(itemPath, QColor(self.backgroundColor))
 80
 81             painter.drawText(QRect(0, i*self.rowHeight, self.width(), self.rowHeight), Qt.AlignVCenter|Qt.AlignHCenter, self.listItems[i])
 82
 83     def mouseMoveEvent(self, evt):
 84         idx = evt.y() / self.rowHeight
 85         if idx >= len(self.listItems):
 86             idx = -1
 87         if idx < len(self.listItems) and idx != self.cursorIndex:
 88             self.update()
 89             self.cursorIndex = idx
 90
 91     def mousePressEvent(self, evt):
 92         idx = evt.y()/self.rowHeight
 93         if  idx< len(self.listItems):
 94             self.currentIndex = idx
 95             self.currentItemChanged.emit(idx, self.listItems[idx])
 96             self.update()
 97
 98     def leaveEvent(self, QEvent):
 99         self.cursorIndex = -1
100         self.update()
101
102
103 class MainWindow(QMainWindow):
104     def __init__(self):
105         super(MainWindow, self).__init__()
106         self.initUI()
107
108     def initUI(self):
109         self.resize(600, 400)
110         self.setWindowTitle(u‘导航条控件‘)
111
112         mainWidget = QWidget()
113         self.setCentralWidget(mainWidget)
114
115         navigationWidget = NavigationWidget()
116         navigationWidget.setRowHeight(50)
117         navigationWidget.setItems([u‘常规‘, u‘高级‘, u‘管理‘, u‘其它‘, u‘关于‘])
118
119         self.tipsLabel = QLabel(u"请选择:")
120
121         mainLayout = QHBoxLayout(mainWidget)
122         mainLayout.setContentsMargins(0, 0, 0, 0)
123         mainLayout.setSpacing(10)
124         mainLayout.addWidget(navigationWidget, 1)
125         mainLayout.addWidget(self.tipsLabel, 3, Qt.AlignCenter)
126
127         navigationWidget.currentItemChanged[int, str].connect(self.slotCurrentItemChanged)
128         navigationWidget.setCurrentIndex(2)
129
130         self.show()
131
132     def slotCurrentItemChanged(self, index, content):
133         self.tipsLabel.setText(u"Current index and content:{} ---- {}".format(index, content))
134
135 def main():
136     app = QApplication(sys.argv)
137     mainWnd = MainWindow()
138     sys.exit(app.exec_())
139
140 if __name__ == ‘__main__‘:
141     main()

原文地址:https://www.cnblogs.com/luke0011/p/9208334.html

时间: 2024-07-31 03:58:32

PyQt4自定义控件----导航栏控件的相关文章

向导导航栏控件----------WinForm控件开发系列

/// <summary> /// 导航导航栏控件 /// </summary> [ToolboxItem(true)] [DefaultProperty("Items")] [DefaultEvent("NavigationItemClick")] [Description("导航导航栏控件")] public partial class NavigationBarExt : Control { public deleg

iOS开发导航栏控件的作用

一,在iOS开发过程中针对一些导航栏上需要自定义视图的情况,有时候需要用系统自带的处理,有些时候需要自定义一些视图并把视图添加上去,这时候主要是它们的位置有些许差别,下面简单写下demo: 1,用导航栏系统自带的视图处理: 1 //1 中间的图片 2 UIImageView *imageBarView = [[UIImageView alloc] initWithFrame:CGRectMake(kScreenWidth / 2.f - 40.f, 20.f, 80, 30)]; 3 image

Android自定义控件---导航栏SlideTab(Fragment+ViewPager)

一.前言 好久没有更新过博客了,趁今天有空分享一个导航栏的自定义控件.有关此控件的demo相信在网上已经烂大街了,一搜一大把. 我现在只着重分享一些我认为比较难理解的知识点.整个控件的难点大概有三个 1.游标的绘制. 2.ViewPager监听器的理解. 3.游标的移动. 本文将注重这三个方面重点分析. 先上Demo的最终效果 二.Demo结构图和知识点 样例Module,有四个java文件和两个xml文件 总结一下此控件的主要知识点 1.ViewGroup绘制流程. 2.ViewPager的用

Android自定义控件之日历控件

Android自定义控件之日历控件 2015-10-23 Android开发中文站 三月份学习android,至今也有半年有余,中间也做过两个项目,但是依然感觉自己做的应用不是很有新意,比不上应用市场上那些应用如此绚丽.所以自己仍需继续努力.学习至今,仍感觉自定义控件是一块硬骨头,还没修炼到身后的内功,下面就切入正题,以一次项目的需求,来实现一个自定义的日历控件.效果图先来一发. 我们分析下效果图,然后确定我们的需求. (1).绘制星期的自定义View,用于标识日期的礼拜. (2).绘制日期的自

自定义控件VS用户控件

1 自定义控件与用户控件区别 WinForm中, 用户控件(User Control):继承自 UserControl,主要用于开发 Container 控件,Container控件可以添加其他Controls控件 自定义控件(Custom Control):继承自 Control,主要用于开发windows控件的最基本的类,比如 Text,Button 控件 2 要开发自己的控件的几种方法[1] 复合控件(Composite Controls):将现有的各种控件组合起来,形成一个新的控件,来满

winform 自定义控件:半透明Loading控件

winform  自定义控件:半透明Loading控件 by wgscd date:2015-05-05 效果: using System;using System.Drawing;using System.Windows.Forms;using System.ComponentModel;using System.Threading; namespace wgscd{ /// <summary> /// 自定义控件:半透明控件 /// </summary> [ToolboxBit

C# 自定义控件VS用户控件

1 自定义控件与用户控件区别 WinForm中, 用户控件(User Control):继承自 UserControl,主要用于开发 Container 控件,Container控件可以添加其他Controls控件 自定义控件(Custom Control):继承自 Control,主要用于开发windows控件的最基本的类,比如 Text,Button 控件 2 要开发自己的控件的几种方法[1] 复合控件(Composite Controls):将现有的各种控件组合起来,形成一个新的控件,来满

Windows Phone 8.1 新功能 - 应用栏控件

2014年4月3日的微软Build 2014 大会上.Windows Phone 8.1 正式公布. 相较于Windows Phone 8.不论从用户还是开发人员的角度,都产生了非常大的变化. 接下来我们会用几篇文章来了解一下这些变化给开发人员带来的影响,以及我们怎样更好的利用WP8.1 的新特性. WP8.1 最大的变化就是与Windows Store App 的结合,我们把它们统称为Windows RunTime apps.WP8.1 中的控件位于Windows.UI.XAML.Contro

【自定义控件】组合控件

组合控件是自定义控件的一种,只不过它是由其他几个原生控件组合而成,故名组合控件. 在实际项目中,GUI会遇到一些可以提取出来做成自定义控件情况. 一个自定义控件的好处就是把一些需要模块化的UI和逻辑放在一起,做到了高内聚,向其他模块提供接口并很少 依赖外界,这样就是低耦合.一个自定义控件就是一个封闭的王国,这里由你掌控. 上述是我自己的一个体会,想必大家也会常做自定义控件吧,就像逻辑部分的模块化一样. 下面我要做一个例子,请看完成图. 下面一排图片加文字就是组合控件了,我是怎么做的呢? 其实这里