PyQt自定义选择输入框(类似QQ登录输入框)

来源:互联网 发布:mac怎么彻底删除软件 编辑:程序博客网 时间:2024/05/21 17:35

本文原创,转载请注明原地址。

作者:酒醉东坡

原文地址:http://blog.csdn.net/jiuzuidongpo/article/details/48347971

实现效果如下图:


还有不带箭头的和不能输入只能选择的:


这个例子可以实现QComboBox条目的删除,目前还没有添加记忆功能,亦可以实现QComboBox的输入功能和选择功能。

重点有下面几个:

首先是QComboBox的条目的自定义,可以按照需要来显示不同样式的条目。

其次是QComboBox的样式表的定义,定义出自己想要的样式。

最后是窗口的外围线条的绘制,很简单。


下面是源代码,可以直接运行,可能需要添加一点图片才可以看出明显效果,供小伙伴们参考和提高。


#coding:utf-8import sysfrom PyQt4.QtGui import *from PyQt4.QtCore import *class Ex(QDialog):    def __init__(self,parent=None):        super(Ex, self).__init__(parent)        self.setWindowFlags(Qt.FramelessWindowHint|Qt.WindowStaysOnTopHint)        self.setStyleSheet(                           "QComboBox{border:1px groove rgb(170,214,252);}"                           "QComboBox{border-radius:2px;}"                           "QComboBox{color:rgb(100,20,200);}"                           "QComboBox{font:times;}"                           "QComboBox{font-size:15px;}"                           "QComboBox{font:bold;}"                           "QComboBox:hover{border-color:rgb(50,150,250)}"                           "QComboBox QAbstractItemView:item{height:50px;}"                           "QComboBox:drop-down{subcontrol-origin:padding;}"                           "QComboBox:drop-down{subcontrol-position:top right;}"                           "QComboBox:drop-down{width:30px;}"                           "QComboBox:drop-down{border-left-width:1px;}"                           "QComboBox:drop-down{border-left-color:rgb(170,214,252);}"                           "QComboBox:drop-down{border-left-style:solid;}"                           "QComboBox:drop-down{border-top-right-radius:3px;}"                            "QComboBox:drop-down{border-bottom-right-radius:3px;}"                           "QComboBox:down-arrow{image:url(images/lower.gif);}"                            )        self.InitUI()        self.setFixedSize(400,450)        self.linePath()#这句放在设置窗口大小的代码之后,方可调用self.width()等函数,不然无效。        #self.setAttribute(Qt.WA_TranslucentBackground,True)#透明窗口    def InitUI(self):        self.tipLabel = QLabel(u"ComboBox",self)        self.tipLabel.setFont(QFont("times",13,QFont.Bold))        self.tipLabel.setStyleSheet("color:white;")        self.closeButton = QPushButton(self)        self.closeButton.setFixedSize(30,30)        self.closeButton.setIcon(QIcon("images/0.png"))        self.closeButton.setIconSize(QSize(30,30))        self.closeButton.setStyleSheet("QPushButton{border:5px;}"                           "QPushButton:hover{background:red;}"                           "QPushButton:pressed{background:black;}")        self.connect(self.closeButton, SIGNAL("clicked()"),self.slotClose)        self.label = QLabel('safafew', self)        self.label.setFixedWidth(200)        self.label.setFont(QFont("times",12,QFont.Bold))        self.combo = QComboBox(self)        self.connect(self.combo, SIGNAL("clicked"),self.comboClicked)        self.combo.setFixedSize(200,30)        self.combo.setFont(QFont("times",12,QFont.Bold))        self.listWidget = QListWidget(self)        self.combo.setModel(self.listWidget.model())        self.combo.setView(self.listWidget)        self.combo.setEditable(True)        #self.combo.lineEdit().setFocusPolicy(Qt.NoFocus)#可以是combox不能被编辑        #self.combo.setFocusPolicy(Qt.NoFocus)#可以是combox不能被编辑        self.account_item = []        for i in range(3):            self.account_item_index = AccountItem()            self.account_item_index.setAccountNumber(QString("safe_") + QString.number(i, 10) + QString("@sina.com"))            self.connect(self.account_item_index, SIGNAL("showAccount"), self.showAccount)            self.connect(self.account_item_index, SIGNAL("removeAccount"), self.removeAccount)            self.account_item.append(self.account_item_index)        for i in range(3):                list_item = QListWidgetItem(self.listWidget)            self.listWidget.setItemWidget(list_item, self.account_item[i])        self.combo.setEditText("safafew")#设置当前值        self.combo.move(100,100)        self.label.move(100,270)    def comboClicked(self):        print "clicked"    def showAccount(self,account):        print account        self.combo.setEditText(account)        self.combo.hidePopup() #隐藏combox所有的选项        self.label.setText(account)    def removeAccount(self,account):        print account        self.combo.hidePopup()        button=QMessageBox.warning(self,"Warning",                                   u"是否删除?",                                   QMessageBox.Discard|QMessageBox.Cancel)        if button==QMessageBox.Discard:            for i in range(len(self.account_item)):                item = self.listWidget.item(i)                account_item_del = self.account_item[i]                account_number = account_item_del.getAccountNumber()                if(account == account_number):                    self.listWidget.takeItem(i)                    self.listWidget.removeItemWidget(item)                    self.account_item.remove(self.account_item[i])                    break        elif button==QMessageBox.Cancel:            self.label.setText("Warning button/Cancel")                def linePath(self):        aPoint = QPoint(0,0)        bPoint = QPoint(self.width()-1,0)        cPoint = QPoint(self.width()-1,self.height()-1)        dPoint = QPoint(0,self.height()-1)        self.linePath = QPainterPath()        self.linePath.moveTo(aPoint)        self.linePath.lineTo(bPoint)        self.linePath.moveTo(bPoint)        self.linePath.lineTo(cPoint)        self.linePath.moveTo(cPoint)        self.linePath.lineTo(dPoint)        self.linePath.moveTo(dPoint)        self.linePath.lineTo(aPoint)        self.linePath.closeSubpath()    def slotClose(self):        self.close()    def mouseMoveEvent(self,event):        if self.mousePressed:            self.move(self.pos() + event.pos() - self.currentPos)       def mousePressEvent(self,event):        if event.buttons() == Qt.LeftButton:            self.currentPos = event.pos()            self.mousePressed = True       def mouseReleaseEvent(self,event):        if event.buttons() == Qt.LeftButton:            self.mousePressed = False                    def paintEvent(self,event):        self.closeButton.move(self.width()-32,2)        self.tipLabel.move(5,5)                p = QPainter(self)        pix = QPixmap("images/background.png")        p.drawPixmap(self.rect(), pix)        p.drawPath(self.linePath)                painter = QPainter(self)        linearGradient = QLinearGradient(0,0,0,35)        linearGradient.setColorAt(0, QColor(60,100,200))        linearGradient.setColorAt(0.1, QColor(6,88,200))        linearGradient.setColorAt(1, QColor(10,100,100))        painter.setBrush(QBrush(linearGradient))        self.menuRect = QRect(0, 0, self.width(), 35)        painter.fillRect(self.menuRect, QBrush(linearGradient))                  class AccountItem(QWidget):    def __init__(self,parent=None):            super(AccountItem,self).__init__(parent)            self.setStyleSheet(                               "QPushButton{border:4px;}"                               "QPushButton:hover{background:red;}"                               "QPushButton:pressed{background:blue;}")            self.mouse_press = False            self.hovered = False            self.account_number = QLabel()            self.account_number.setFont(QFont("times",14,QFont.Bold))            self.iconLabel = QLabel()            self.iconLabel.setFixedSize(40,40)            pixmap0 = QPixmap("images/icon.png").scaled(40,40)            self.iconLabel.setPixmap(pixmap0)            self.delede_button = QPushButton()            pixmap = QPixmap("images/icon.png").scaled(20,20)            self.delede_button.setIcon(QIcon(pixmap))            self.delede_button.setIconSize(pixmap.size())            #self.delede_button.setStyleSheet("background:transparent;");            self.connect(self.delede_button, SIGNAL("clicked()"), self.removeAccount)            main_layout = QHBoxLayout()            main_layout.addWidget(self.iconLabel)            main_layout.addWidget(self.account_number)            main_layout.addStretch()            main_layout.addWidget(self.delede_button)            main_layout.setContentsMargins(5, 5, 5, 5)            main_layout.setSpacing(5)            self.setLayout(main_layout)    def setAccountNumber(self,account_text):        self.account_number.setText(account_text)    def getAccountNumber(self):        account_number_text = self.account_number.text()        return account_number_text    def removeAccount(self):        account_number_text = self.account_number.text()        self.emit(SIGNAL("removeAccount"),account_number_text)            def mousePressEvent(self,event):        if(event.button() == Qt.LeftButton):            self.mouse_press = True    def mouseReleaseEvent(self,event):        if(self.mouse_press):            account_number_text = self.account_number.text()            self.emit(SIGNAL("showAccount"),account_number_text)            self.mouse_press = False    def enterEvent(self,event):        self.hovered = True        self.repaint()    def leaveEvent(self,event):        self.hovered = False        self.repaint()     def paintEvent(self,event):        painter0 = QPainter(self)        brush0 = QBrush(QColor(255,255,200))        painter0.setBrush(brush0)        painter0.fillRect(QRect(0,0,self.width(),self.height()), brush0)                painter1=QPainter(self)        painter1.setPen(QPen(QColor(Qt.lightGray),1))        outline = QPainterPath()        outline.addRoundedRect(0, 0, self.width(), self.height(), 0, 0)        painter1.setOpacity(1)        painter1.drawPath(outline)                if self.hovered == True:            painter = QPainter(self)            brush = QBrush(QColor(Qt.lightGray))            painter.setBrush(brush)            painter.fillRect(QRect(0,0,self.width(),self.height()), brush)        app = QApplication(sys.argv)ex = Ex()ex.show()app.exec_()


1 0
原创粉丝点击