33 Star 111 Fork 40

经济适用坟 / 微信PC客户端

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
userPannel.py 30.74 KB
一键复制 编辑 原始数据 按行查看 历史
经济适用坟 提交于 2018-08-31 16:11 . 新建 userPannel.py
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os,sys,io
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import itchat
from PIL import Image as pilimgtools
DEFAULT_GROUP = u'undefined'
DEFAULT_HEAD = u'icons/qq.png'
DEFAULT_USER = u'new user'
DEFAULT_NOTE = u''
class LabelHead(QLabel):
'''LabelHead(QLabel) 类主要是为了展示用户头像,
但是在编辑用户头像的时候单击他要可以选择头像文件。
因此增加了一个只读属性,当只读时单击不生效,可读时单击弹出图片选择框。'''
def __init__(self,addr = DEFAULT_HEAD):
super(LabelHead,self).__init__()
self.setScaledContents(True)
self.setReadOnly(True)
self.setPicture(addr)
def setReadOnly(self,b):
self._readOnly = bool(b)
def setPicture(self,addr):
'''设置图像:继承至QLabel以便可以setPixmap设置图片'''
self._picAddr = unicode(addr)
img = QPixmap(os.path.join('dist',addr))
self.setPixmap(img)
return True
def getPicture(self):
return self._picAddr
def mousePressEvent(self,e):
'''只读时屏蔽其鼠标点击事件'''
if self._readOnly:
e.ignore() #忽略鼠标点击,传递到父对象中
else:
dialog = QFileDialog(self,u'请选择头像文件...')
dialog.setDirectory(os.getcwd() + '/icons') #设置默认路径
dialog.setNameFilter(u"图片文件(*.png *.jpg *.bmp *.ico);;")#中间一定要用两个分号才行!
if dialog.exec_():
selectFileName = unicode(dialog.selectedFiles()[0])
self.setPicture(selectFileName)
else:
pass
e.accept() #此时禁止该事件往下传递
class LineEdit(QTextEdit):
'''用户信息显示类:主要是支持可以编辑和不可以编辑'''
def __init__(self,sz = None):
super(LineEdit,self).__init__(unicode(sz))#父类输入文字内容
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setFixedHeight(18)
self.setReadOnly(True)
def wheelEvent(self, event):
event.ignore()
def setReadOnly(self,b):
'''LineEdit(QLineEdit) 类主要是为了显示用户和组名称,
因此在编辑用户和组名称时需要其为可以输入,其它时候为不可输入,
因此继承到QLineEdit。通过其setStyleSheet设置只读和可读时的状态实现。'''
if b:
self._readOnly = True
self.setStyleSheet("border:0px;padding:0px;margin:0px;border-style:outset;background-color:rgba(0,0,0,0)")#rgba(0,0,0,0)
else:
self._readOnly = False
self.setStyleSheet("color:#010101")
super(LineEdit,self).setReadOnly(self._readOnly)
def contextMenuEvent(self,e):
'''QLineEdit默认有右键菜单,因此为了让其在只读时不影响列表右键菜单操作,
重写其contextMenuEvent,可写时调用父类的即可'''
if self._readOnly:
e.ignore() #忽略右键菜单
else:
super(LineEdit,self).contextMenuEvent(e)
def mousePressEvent(self,e):
'''屏蔽其鼠标点击事件'''
if self._readOnly:
e.ignore() #屏蔽所有鼠标操作
else:
super(LineEdit,self).mousePressEvent(e)
def mouseDoubleClickEvent(self,e):
'''鼠标双击选择事件: 双击选中全部内容可以用于ctrl+c复制'''
if self._readOnly:
self.setSelection(0,self.maxLength())#双击时选中,可以ctrl+c
e.ignore() #屏蔽所有鼠标操作
else:
super(LineEdit,self).mouseDoubleClickEvent(e)
def mouseMoveEvent(self,e):
'''鼠标移动事件'''
if self._readOnly:
e.ignore() #屏蔽所有鼠标操作
else:
super(LineEdit,self).mouseMoveEvent(e)
class UserItem(QWidget):
'''自定义的用户信息控件'''
def __init__(self, listWidgetItem, usrId, **args):
super(UserItem,self).__init__()
self._listWidgetItem = listWidgetItem
self._id = usrId
self._headWidget = LabelHead()
self._headWidget.setFixedSize(40, 40)
self.setHead(args.get('head',DEFAULT_HEAD))
self._nameWidget = LineEdit()
self._nameWidget.setFont(QFont("Microsoft YaHei",10,QFont.Bold))
self.setName(args.get('name',DEFAULT_USER))
self.setCity(args.get('city',''))
self.setSex(args.get('sex','0'))
self.setAuto(args.get('isauto',False))
self.setRemarkname(args.get('remarkname',''))
self._noteWidget = LineEdit()
self.setNote(args.get('note',DEFAULT_NOTE))
vbox = QVBoxLayout()
vbox.addWidget(self._nameWidget)
vbox.addWidget(self._noteWidget)
vbox.addStretch()
hbox = QHBoxLayout()
hbox.addWidget(self._headWidget)
hbox.addLayout(vbox)
self.setLayout(hbox)
def getListItem(self):
return self._listWidgetItem
def setCity(self,name):
self._city=name
def setAuto(self,auto):
self._isauto=auto
def isAuto(self):
return self._isauto
def setSex(self,sex):
self._sex=sex
def getCity(self):
return self._city
def getSex(self):
return self._sex
def setRemarkname(self,remark):
self._remarkname=remark
def getRemarkname(self):
return self._remarkname
def setName(self,name):
self._name = unicode(name)
self._nameWidget.setText('%s' %(self._name))
self._nameWidget.setReadOnly(True)
def getNameInput(self):
return self._nameWidget.text()
def getName(self):
return self._name
def setNote(self,note):
self._note = unicode(note)
self._noteWidget.setText(self._note)
self._noteWidget.setReadOnly(True)
def getNoteInput(self):
return self._noteWidget.text()
def getNote(self):
return self._note
def setHead(self,head):
self._head = unicode(head)
self._headWidget.setPicture(self._head)
self._headWidget.setReadOnly(True)
def getHead(self):
return self._headWidget.getPicture()
def getHeadInput(self):
return self._headWidget.getPicture()
def editInfo(self):#允许编辑用户信息
self._nameWidget.setReadOnly(False)
self._noteWidget.setReadOnly(False)
self._headWidget.setReadOnly(False)
self._nameWidget.setText(self._name)
self._nameWidget.setFocus()
def lockInfo(self):#锁定用户信息
self._nameWidget.setReadOnly(True)
self._noteWidget.setReadOnly(True)
self._headWidget.setReadOnly(True)
'''复写的父类方法'''
def keyPressEvent(self,e):
'''回车键确认输入内容'''
if e.key() == Qt.Key_Return:
self._listWidgetItem.confirmInput()
def contextMenuEvent(self,e):
'''右键菜单'''
editUser = QAction(QIcon('icons/edit.png'),u'修改',self)#第一个参数也可以给一个QIcon图标
editUser.triggered.connect(self.editInfo)
delUser = QAction(QIcon('icons/delete.png'),u'删除',self)
delUser.triggered.connect(self._listWidgetItem.delSelfFromList)#选中就会触发
menu = QMenu()
menu.addAction(editUser)
menu.addAction(delUser)
menu.exec_(QCursor.pos())#全局位置比较好,使用e.pos()还得转换
e.accept() #禁止弹出菜单事件传递到父控件中
def mouseMoveEvent(self, e):
'''鼠标移动下的右键按住才有效'''
if e.buttons() != Qt.LeftButton:#右键按住
return e.ignore()
mimeData = QMimeData()#生成拖动数据
drag = QDrag(self)#拖动对象
drag.setMimeData(mimeData)#设置拖动数据
drag.setHotSpot(e.pos() - self.rect().topLeft())#左上角位置
dropAction = drag.start(Qt.MoveAction)#开始拖动
e.accept()
class UserListItem(QListWidgetItem):
'''用户信息列表控件'''
def __init__(self, parent, usrId, name = DEFAULT_USER,
head = DEFAULT_HEAD, note = DEFAULT_NOTE,
group = DEFAULT_GROUP,city='',sex='0',remarkname='',isauto=False):
super(UserListItem,self).__init__(name,None,QListWidgetItem.UserType)#parent给None才能正确的insertItem而不能addItem
self._id = usrId
self._group = unicode(group) #这两个参数放在本类,其它参数放到子类
self._parent = parent
self._widget = UserItem(self,usrId,name = name, head = head, note = note,city=city,sex=sex,remarkname=remarkname,isauto=isauto)
self._widget.lockInfo()
self.setTextColor(QColor(0x00,0x00,0x00,0x00))#设置控件文字为透明色以便不干扰控件的显示
self.setSizeHint(self._widget.sizeHint())
def getWidget(self):
return self._widget
def getId(self):
return self._id
def getId(self):
return self._id
def setGroup(self,group):
self._group = unicode(group)
self.setText(self._group + '_' + self.getNameInput())#同步更新一下
print 'the group of user %s should be undated!'%self.getName()
def getGroup(self):
return self._group
def setName(self,name):
self._widget.setName(name)
self.setText(self._group + '_' + name)#同步更新一下
def getNameInput(self):
return self._widget.getNameInput()
def getName(self):
return self._widget.getName()
def getSex(self):
return self._widget.getSex()
def getCity(self):
return self._widget.getCity()
def getRemarkname(self):
return self._widget.getRemarkname()
def setNote(self,note):
self._widget.setNote(note)
def setAuto(self,auto):
self._widget.setAuto(auto)
def isAuto(self):
return self._widget.isAuto()
def getNoteInput(self):
return self._widget.getNoteInput()
def getNote(self):
return self._widget.getNote()
def setHead(self,head):
self._widget.setHead(head)
def getHeadInput(self):
return self._widget.getHeadInput()
def getHead(self):
return self._widget.getHead()
def confirmInput(self):#确认输入,一定要有输入才能确认输入
self.setName(self.getNameInput())
self.setNote(self.getNoteInput())
self.setHead(self.getHeadInput())
self._widget.lockInfo()
def giveUpInput(self):#放弃输入
self.setName(self.getName())
self.setNote(self.getNote())
self.setHead(self.getHead())
self._widget.lockInfo()
def delSelfFromList(self):
self._parent.removeUserItem(self)
'''以下为复写的父控件方法'''
class GroupItem(QWidget,QObject):
"""自定义的组信息控件"""
expended = pyqtSignal(bool) #展开与否的信号
def __init__(self, listWidgetItem, name = DEFAULT_GROUP):
super(GroupItem, self).__init__()
self.setAcceptDrops(True)#允许拖入
self._listWidgetItem = listWidgetItem
self._expendWidget = QPushButton()
self._expendWidget.clicked.connect(self.toggleGroup)
self._expendWidget.setFixedSize(10,10)
self._isOpen = False
self.toggleGroup() #设置为展开
self._nameWidget = LineEdit()
self._nameWidget.setFont(QFont("Times",10,QFont.Normal))
self.setName(name)
hbox = QHBoxLayout()
hbox.addWidget(self._expendWidget)
hbox.addWidget(self._nameWidget)
hbox.addStretch()
self.setLayout(hbox)
def setName(self,name):
self._name = unicode(name)
self._nameWidget.setText('%s (%d)'%(name, len(self._listWidgetItem.usrList)))
self._nameWidget.setReadOnly(True)
def getNameInput(self):
return self._nameWidget.text()
def getName(self):
return self._name
def toggleGroup(self):#点击则展开和折叠
self._isOpen = not self._isOpen
if self._isOpen:
self._expendWidget.setStyleSheet("border-image: url(icons/arrow_d.png);")
else:
self._expendWidget.setStyleSheet("border-image: url(icons/arrow_r.png);")
self._expendWidget.update()#刷新该控件
self.expended.emit(not self._isOpen)#发送信号,这里展开是不hidden,因此取非
def editInfo(self):#允许编辑用户信息
self._nameWidget.setReadOnly(False)
self._nameWidget.setText(self._name)
self._nameWidget.setFocus()
def lockInfo(self):#锁定用户信息
self._nameWidget.setReadOnly(True)
'''复写的父类方法'''
def keyPressEvent(self,e):#回车键确认输入内容
if e.key() == Qt.Key_Return:
self._listWidgetItem.confirmInput()
def contextMenuEvent(self,e): #右键菜单
adusr = QAction(QIcon('icons/user.png'),u'添加用户',self)
adusr.triggered.connect(self._listWidgetItem.addNewUser)
editGroup = QAction(QIcon('icons/edit.png'),u'修改',self)
editGroup.triggered.connect(self.editInfo)
delGroup = QAction(QIcon('icons/delete.png'),u'删除',self)
delGroup.triggered.connect(self._listWidgetItem.delSelfFromList)#选中就会触发
menu = QMenu()
menu.addAction(adusr)
menu.addAction(editGroup)
menu.addAction(delGroup)
menu.exec_(QCursor.pos())#全局位置比较好,使用e.pos()还得转换
e.accept() #禁止弹出菜单事件传递到父控件中
def dragEnterEvent(self, e):
'''外部拖入事件允许,必须在这里accept后才能到dropEvent中确认放入!'''
self._listWidgetItem.setSelected()
e.accept()
def dropEvent(self, e):#放入事件
src = e.source() #获取目标控件
srcUit = src.getListItem()
self._listWidgetItem.moveUserIn(srcUit)
e.accept()
class GroupListItem(QListWidgetItem):
'''用户信息列表控件'''
def __init__(self, parent, name = DEFAULT_GROUP):
super(GroupListItem,self).__init__(name,None,QListWidgetItem.UserType)#parent给None才能正确的insertItem而不能addItem
self.usrList = []# 组里面的用户列表,用到全局会是静态的
self._parent = parent
self._widget = GroupItem(self,name = name)
self._widget.lockInfo()
self.setTextColor(QColor(0x00,0x00,0x00,0x00))#设置控件文字为透明色以便不干扰控件的显示
self.setSizeHint(self._widget.sizeHint())
def getWidget(self):
return self._widget
def setName(self,name):
self._widget.setName(name)
self.setText(self.getName()) #同步更新
def getNameInput(self):
return self._widget.getNameInput()
def getName(self):
return self._widget.getName()
def confirmInput(self):#确认输入
self._parent.groupDict.pop(self.getName())#移除之前的Group键值对
self.setName(self._widget.getNameInput())
self._parent.groupDict[self.getName()] = self#添加当前名字的Group键值对
self._widget.lockInfo()
def giveUpInput(self):#放弃输入
self.setName(self.getName())
self._widget.lockInfo()
def delSelfFromList(self):
self._parent.removeGroupItem(self)
@pyqtSlot()
def addNewUser(self):
(ok,uit,git) = self._parent.addUser(group = self.getName())#调用父类的添加用户,但是添加到本组下
self._parent.setCurrentItem(uit)#选中当前增加的用户,这一步很关键。
# 这样的另一个好处是执行一次item切换,保证之前输入的放弃操作--输入失焦。
uit.getWidget().editInfo()#允许可以编辑
def addUser(self,uit):
self.usrList.append(uit)
self._widget.expended.connect(uit.setHidden)
self.setName(self.getName())#为了刷新显示用户数量
def delUser(self, uit):
self.usrList.pop(self.usrList.index(uit))
self.setName(self.getName())#为了刷新显示用户数量
def moveUserIn(self,uit):#调用父类的方法移动用户
self._parent.moveUser(uit,self.getName())
def setSelected(self):
self._parent.setItemSelected(self,True)
'''以下为复写的父控件方法'''
class GroupUserList(QListWidget):
'''实现好友分组列表的效果'''
groupDict = {}
userDict = {}
def __init__(self,parent = None):
super(GroupUserList,self).__init__(parent)
self.currentItemChanged.connect(self.chooseItemChanged)
self.setAcceptDrops(False)
self.setStyleSheet("QListWidget{margin:0px;border:0px;padding:0px;background-color:#edeae8;}"
"QListWidget::item{border:0px solid gray;background-color:transparent;padding:0px;color:transparent}"
"QListView::item:!enabled{background-color:transparent;color:transparent;border:0px solid gray;padding:0px 0px 0px 0px;}"
"QListWidget::item:hover{background-color:#dfdfdf;color:transparent;border:0px solid gray;padding:0px 0px 0px 0px;}"
"QListWidget::item:selected{background-color:#c6c5c5;color:transparent;border:0px solid gray;padding:0px 0px 0px 0px;}"
"QScrollBar{background:transparent;width:4px;}"
"QScrollBar::handle{background:lightgray; border:2px solid transparent; border-radius:5px; }"
"QScrollBar::handle:hover{background:green; }"
"QScrollBar::handle:pressed{background:green;}"
"QScrollBar::sub-line{background:transparent;}"
"QScrollBar::add-line{background:transparent;}")
self.setMaximumWidth(250)
self.setMinimumWidth(180)
def updataChatListItem(self,username):
if self.userDict and self.userDict.has_key(username):
it=self.userDict[username]
self.insertItem(0,it)
def getItemByName(self,username):
if self.userDict and self.userDict.has_key(username):
return self.userDict[username]
else:
print 'Not has This Item '+username
def updateNote(self,username,msg):
if self.userDict and self.userDict.has_key(username):
self.userDict[username].setNote(msg)
def addGroup(self, name = DEFAULT_GROUP):
'''判断是否已存在并添加组'''
name = unicode(name)
groupNames = self.groupDict.keys()
# print name, groupNames
if name not in groupNames:#不存在则创建该keys
git = GroupListItem(self,name)
index = self.count() + 1
self.insertItem(index,git)
self.groupDict[name] = git #保存GroupItem对象到全局groupDict里面用于
return (True, git)
else:
git = self.groupDict[name]
return (False, git)
_currentId = 1 #用户ID从1递增
def addUser(self, name = DEFAULT_USER, head = DEFAULT_HEAD,note = DEFAULT_NOTE,group = DEFAULT_GROUP,uId = None,city='',sex='0',remarkname='',isauto=False):
'''添加用户'''
(isExist, git) = self.addGroup(group)#判断组是否存在并增加组
index = self.indexFromItem(git).row()#查找组存在的index
if uId:#指定ID
uId = int(uId)
uit = UserListItem(self,uId,name,head,note,group,city,sex,remarkname,isauto)
else:#未指定ID
uit = UserListItem(self,self._currentId,name,head,note,group,city,sex,isauto)
self._currentId+= 1 #ID依次增加,保证每个用户有一个唯一的标志符
self.insertItem(index+1,uit)
self.userDict[head]=uit
git.addUser(uit)
# print uit.getName(),uit.getGroup(),uit.getId()
return (True,uit,git)#返回增加的用户和其组
def removeUserItem(self,uit):
'''移除用户Item'''
git = self.groupDict[uit.getGroup()]
git.delUser(uit)#用户对应的组下的uit列表需要删除该用户
self.takeItem(uit)
del uit
def removeGroupItem(self,git):
'''移除组Item,其下的用户移动到默认分组'''
gName = git.getName()
if gName == DEFAULT_GROUP:
print "Group %s can't be deleted!"%(gName)
return False
for uit in git.usrList:
self.addUser(name = uit.getName(),head = uit.getHead(),
note = uit.getNote(),uId = uit.getId())#分组为默认
self.takeItem(uit)
# git.delUser(uit) #这样执行后usrList改变会导致for循环出错,最终都会少出git所以这里不用移除它就好了
del uit
self.takeItem(git)
self.groupDict.pop(git.getName())
del git
def moveUser(self, uit, group = DEFAULT_GROUP):
'''移动用户到组,就是原组中删除该用户,然后新组中添加该用户'''
self.addUser(name = uit.getName(),head = uit.getHead(),
note = uit.getNote(),uId = uit.getId(),group = group)#分组指定
self.removeUserItem(uit)
@pyqtSlot(QListWidgetItem,QListWidgetItem)#Item选择变化
def chooseItemChanged(self,curit,preit):
if preit:#存在则锁住,第一个点击的选项会不存在
preit.giveUpInput() #放弃输入,因为没有单击回车确认输入
_gIndex = 1 #组编号递增参数
@pyqtSlot(bool)#右键增加组菜单
def slotAddGroup(self,b):
group = u'%s_%d'%(DEFAULT_GROUP,self._gIndex)
self._gIndex += 1
(ok,git) = self.addGroup(group)
self.setCurrentItem(git)#选中当前增加的组,这一步很关键。
# 这样的另一个好处是执行一次item切换,保证之前输入的放弃操作--输入失焦。
git.getWidget().editInfo()#允许可以编辑
@pyqtSlot(bool)#右键增加用户菜单
def slotAddUser(self,b):
(ok,uit,git) = self.addUser()#默认用户名信息就行了
self.setCurrentItem(uit)#选中当前增加的用户,这一步很关键。
# 这样的另一个好处是执行一次item切换,保证之前输入的放弃操作--输入失焦。
uit.getWidget().editInfo()#允许可以编辑
'''复写的父类方法'''
def insertItem(self,index,it):
super(GroupUserList,self).insertItem(index,it)
if isinstance(it,GroupListItem) or isinstance(it,UserListItem):
self.setItemWidget(it,it.getWidget())
def takeItem(self,it):
'''父类是根据index删除,不实用'''
if isinstance(it,int):#父类兼容
return super(GroupUserList,self).takeItem(index)
else: #根据item删除,增加的功能
index = self.indexFromItem(it).row()
return super(GroupUserList,self).takeItem(index)
def contextMenuEvent(self,e):
'''右键菜单'''
adgrp = QAction(QIcon('icons/group.png'),u'增加组',self)#第一个参数也可以给一个QIcon图标
adgrp.triggered.connect(self.slotAddGroup)
adusr = QAction(QIcon('icons/user.png'),u'增加用户',self)
adusr.triggered.connect(self.slotAddUser)#选中就会触发
menu = QMenu()
menu.addAction(adgrp)
menu.addAction(adusr)
menu.exec_(QCursor.pos())#全局位置比较好,使用e.pos()还得转换
e.accept() #禁止弹出菜单事件传递到父控件中
def dragEnterEvent(self, e):#外部拖入事件允许
# print e.pos()#获取鼠标位置
e.accept()
def dragMoveEvent(self,e): #鼠标内部拖动事件
# print e.pos()#获取鼠标位置
e.accept()
def dropEvent(self, e):#放入事件
# print e.pos()
e.accept()
class ChatList(QListWidget):
userDict = {}
def __init__(self,parent = None):
super(ChatList,self).__init__(parent)
self.currentItemChanged.connect(self.chooseItemChanged)
self.setAcceptDrops(False)
self.setStyleSheet("QListWidget{margin:0px;border:0px;padding:0px;background-color:#edeae8;}"
"QListWidget::item{border:0px solid gray;background-color:transparent;padding:0px;color:transparent}"
"QListView::item:!enabled{background-color:transparent;color:transparent;border:0px solid gray;padding:0px 0px 0px 0px;}"
"QListWidget::item:hover{background-color:#dfdfdf;color:transparent;border:0px solid gray;padding:0px 0px 0px 0px;}"
"QListWidget::item:selected{background-color:#c6c5c5;color:transparent;border:0px solid gray;padding:0px 0px 0px 0px;}"
"QScrollBar{background:transparent;width:4px;}"
"QScrollBar::handle{background:lightgray; border:2px solid transparent; border-radius:5px; }"
"QScrollBar::handle:hover{background:green; }"
"QScrollBar::handle:pressed{background:green;}"
"QScrollBar::sub-line{background:transparent;}"
"QScrollBar::add-line{background:transparent;}")
self.setMaximumWidth(250)
self.setMinimumWidth(180)
def updateNote(self,username,msg):
if self.userDict and self.userDict.has_key(username):
self.userDict[username].setNote(msg)
_currentId = 1 #用户ID从1递增
def addUser(self,uit,note):
if self.userDict and self.userDict.has_key(uit.getHead()):
tempit=self.userDict[uit.getHead()]
self.removeUserItem(tempit)
cit=UserListItem(self,uit.getId(),uit.getName(),uit.getHead(),note)#UserListItem(self,uId,name,head,note,group)
self.insertItem(0,cit)
self.userDict[uit.getHead()]=cit
return cit
def removeUserItem(self,uit):
self.takeItem(uit)
del uit
@pyqtSlot(QListWidgetItem,QListWidgetItem)#Item选择变化
def chooseItemChanged(self,curit,preit):
if preit:#存在则锁住,第一个点击的选项会不存在
preit.giveUpInput() #放弃输入,因为没有单击回车确认输入
_gIndex = 1 #组编号递增参数
@pyqtSlot(bool)#右键增加用户菜单
def slotAddUser(self,b):
uit = self.addUser()#默认用户名信息就行了
self.setCurrentItem(uit)#选中当前增加的用户,这一步很关键。
# 这样的另一个好处是执行一次item切换,保证之前输入的放弃操作--输入失焦。
uit.getWidget().editInfo()#允许可以编辑
def insertItem(self,index,it):
super(ChatList,self).insertItem(index,it)
if isinstance(it,UserListItem):
self.setItemWidget(it,it.getWidget())
def takeItem(self,it):
'''父类是根据index删除,不实用'''
if isinstance(it,int):#父类兼容
return super(ChatList,self).takeItem(index)
else: #根据item删除,增加的功能
index = self.indexFromItem(it).row()
return super(ChatList,self).takeItem(index)
def contextMenuEvent(self,e):
'''右键菜单'''
adgrp = QAction(QIcon('icons/group.png'),u'增加组',self)#第一个参数也可以给一个QIcon图标
adgrp.triggered.connect(self.slotAddGroup)
adusr = QAction(QIcon('icons/user.png'),u'增加用户',self)
adusr.triggered.connect(self.slotAddUser)#选中就会触发
menu = QMenu()
menu.addAction(adgrp)
menu.addAction(adusr)
menu.exec_(QCursor.pos())#全局位置比较好,使用e.pos()还得转换
e.accept() #禁止弹出菜单事件传递到父控件中
class SearchWidget(QWidget):
def __init__(self,parent = None):
super(SearchWidget,self).__init__(parent)
self.setStyleSheet("margin:0px;border:0px;padding:0px;background-color:#edeae8;")
self.setMaximumHeight(60)
self.setMinimumHeight(60)
self.lineedit = QLineEdit("")
self.lineedit.setStyleSheet("width:220;height:20px;padding-left:20px;margin-top:20px;padding-right:5px;padding-top:5px;padding-bottom:5px;border:1px solid #cccccc;")
self.lineedit.setParent(self)
label4 = QLabel()
label4.setGeometry(QRect(8, 27, 14, 14))
label4.setStyleSheet("QLabel{background-image:url(img/search.png);}")
label4.setParent(self)
class UserPannel(QSplitter):
def __init__(self,parent = None):
super(UserPannel,self).__init__(parent)
self.setOrientation(Qt.Vertical)
self.setStyleSheet("margin:0px;border:0px;padding:0px;background-color:#edeae8;")
self.search_Widget=SearchWidget()
self.search_Widget.setParent(self)
self.chat_ListWidget = ChatList()
self.user_ListWidget = GroupUserList()
self.chat_ListWidget.setParent(self)
self.user_ListWidget.setParent(self)
self.user_ListWidget.hide()
def setUserListItemClickedEvent(self,UserListItemClickedEvent):
self.user_ListWidget.itemClicked.connect(UserListItemClickedEvent)
def setChatListItemClickedEvent(self,ChatListItemClickedEvent):
self.chat_ListWidget.itemClicked.connect(ChatListItemClickedEvent)
def showUserPannel(self):
self.user_ListWidget.show()
self.chat_ListWidget.hide()
def showChatPannel(self):
self.chat_ListWidget.show()
self.user_ListWidget.hide()
def sendNewMessage(self,username,note):
self.updateNewMessage(username,note)
self.chat_ListWidget.setCurrentRow(0)
def updateNewMessage(self,username,note):
self.user_ListWidget.updateNote(username,note)
uit=self.user_ListWidget.getItemByName(username)
if uit:
self.chat_ListWidget.addUser(uit,note)
def isAutoRepy(self,username):
uit=self.user_ListWidget.getItemByName(username)
if uit:
return uit.isAuto()
else :
print username +'is none'
return False
def initUserData(self,list):
for users in list[1]:
self.user_ListWidget.addUser(users['NickName'],group = u'联系人',head = users['UserName'],sex = users['Sex'],city=users['City'],remarkname=users['RemarkName'])
for users in list[2]:
self.user_ListWidget.addUser(users['NickName'],group = u'群聊',head = users['UserName'])
if __name__ == "__main__":
def test(event):
print event
app = QApplication(sys.argv)
menu_pannel = UserPannel()
menu_pannel.show()
sys.exit(app.exec_())
Python
1
https://gitee.com/wengshaojie/wechat_pc_client.git
git@gitee.com:wengshaojie/wechat_pc_client.git
wengshaojie
wechat_pc_client
微信PC客户端
master

搜索帮助