ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python Qt:pyqtProperty,样式表和事件处理程序

2019-10-30 01:57:49  阅读:241  来源: 互联网

标签:pyqt pyqt4 python


最近,我一直在努力理解pyqtProperty的用法.在下面的代码段中,我尝试创建一个自定义按钮,单击该按钮将更改其文本和外观.我想将逻辑和外观分开,所以我创建了自定义属性“ state”,该属性在样式表中使用.

结果对我来说有点奇怪.程序抛出“ CustomButton”对象没有属性“ _state”异常,但仍会运行.单击按钮后,按钮的文本会更改,但颜色保持不变.

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtGui, QtCore

STYLE = '''
CustomButton {
    margin: 50px;
    padding: 10px;
}
CustomButton[state='true'] {
    background: yellowgreen;
}
CustomButton[state='false'] {
    background: orangered;
}
'''


class CustomButton(QtGui.QPushButton):
    def __init__(self):
        super(CustomButton, self).__init__()
        self.setText('ON')
        self.setStyleSheet(STYLE)
        self._state = True

    def g_state(self):
        return self._state

    def s_state(self, value):
        self._state = value

    state = QtCore.pyqtProperty(bool, fget=g_state, fset=s_state)

    def mousePressEvent(self, event):
        print 'clicked'
        if self.state == True:
            self.state = False
            self.setText('OFF')
        else:
            self.state = True
            self.setText('ON')


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    b = CustomButton()
    b.show()
    sys.exit(app.exec_())

解决方法:

这里有几个问题.

首先,重新实现的mousePressEvent应该调用基类实现,以保留正常的行为.

其次,对属性的更改不会自动触发样式更改,因此您需要在代码中显式地进行更改.

另外,值得注意的是pyqtProperty可以用作装饰器,这可能会稍微提高代码的可读性.

因此,经过这些更改,代码可能看起来像这样:

    ...

    @QtCore.pyqtProperty(bool)
    def state(self):
        return self._state

    @state.setter
    def state(self, value):
        self._state = value

    def mousePressEvent(self, event):
        print 'clicked'
        if self.state:
            self.state = False
            self.setText('OFF')
        else:
            self.state = True
            self.setText('ON')
        self.style().unpolish(self)
        self.style().polish(self)
        self.update()
        super(CustomButton, self).mousePressEvent(event)

标签:pyqt,pyqt4,python
来源: https://codeday.me/bug/20191030/1964419.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有