首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新QStyle中的EnterEvent

更新QStyle中的EnterEvent
EN

Stack Overflow用户
提问于 2021-08-22 15:47:32
回答 2查看 127关注 0票数 0

当鼠标进入\out小部件(enterEvent\leaveEvent )时,我想更新LineEdit的LineEdit,我试图在drawPrimitive函数中添加一个bool变量,但是我得到了错误TypeError: drawPrimitive(self,QStyle.PrimitiveElement,QStyleOption,QPainter,小部件: QWidget = None):'a‘不是一个有效的关键字参数。

代码语言:javascript
复制
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PushButton_2 import Push_Button_
import sys

class LineEditStyle(QProxyStyle):
    def drawPrimitive(self, element, option, painter, widget,a=None):
        if a :
            self.pen = QPen(QColor('green'))
        else :
            self.pen = QPen(QColor('red'))
        self.pen.setWidth(4)
        if element == QStyle.PE_FrameLineEdit:
            painter.setRenderHint(QPainter.Antialiasing)
            painter.setPen(self.pen)
            painter.drawRoundedRect(QRect(0,0,400,40), 10, 10)
        else:
            super().drawPrimitive(element, option, painter, widget)

        
class LineEdit(QLineEdit):
    def __init__(self,*args,**kwargs):
        QLineEdit.__init__(self,*args,**kwargs)
        self.a = 0
    
    def enterEvent(self, a0):
        self.a = 1

    def leaveEvent(self, a0):
        self.a = 0
        
    def paintEvent(self,event):
        option = QStyleOption()
        option.initFrom(self)
        self.style().drawPrimitive(QStyle.PE_FrameLineEdit,option,a=self.a)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = QMainWindow()
    window.setGeometry(500,500,400,400)
    window.setStyleSheet('background-color:#373737')
    line = LineEdit(parent=window)
    line.setGeometry(20,200,400,40)
    style = LineEditStyle()
    line.setStyle(style)
    window.show()
    sys.exit(app.exec())
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-22 16:29:56

不能将QStyleSheet与QStyle一起使用,因为它会造成混乱,并且必须将默认参数Widget设置为None

代码语言:javascript
复制
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PushButton_2 import Push_Button_
import sys

class LineEditStyle(QProxyStyle):
    def drawPrimitive(self, element, option, painter, widget=None,a=None):
        if a :
            self.pen = QPen(QColor('green'))
        else :
            self.pen = QPen(QColor('red'))
        self.pen.setWidth(4)
        if element == QStyle.PE_FrameLineEdit:
            painter.setRenderHint(QPainter.Antialiasing)
            painter.setPen(self.pen)
            painter.drawRoundedRect(QRect(0,0,400,40), 10, 10)
        else:
            super().drawPrimitive(element, option, painter, widget)
    
    def subElementRect(self, element, option, widget):
        if element == QStyle.SE_LineEditContents :
            return QRect(0,0,50,30)
        else :
            return super().subElementRect(element, option, widget)
    
    def drawItemText(self, painter, rect, flags, pal, enabled, text, textRole):
        rect_ = QRect(20,20,50,50)
        text = text.upper()
        painter.drawText(text,rect_,Qt.AlignCenter)
        
class LineEdit(QLineEdit):
    def __init__(self,*args,**kwargs):
        QLineEdit.__init__(self,*args,**kwargs)
        self.a = 0
    
    def enterEvent(self, a0):
        self.a = 1

    def leaveEvent(self, a0):
        self.a = 0
        
    def paintEvent(self,event):
        option = QStyleOption()
        option.initFrom(self)
        painter = QPainter(self)
        self.style().drawPrimitive(QStyle.PE_FrameLineEdit,option,painter,a=self.a)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = QMainWindow()
    window.setGeometry(500,500,400,400)
    #window.setStyleSheet('background-color:#373737')
    line = LineEdit(parent=window)
    line.setGeometry(20,200,400,40)
    style = LineEditStyle()
    line.setStyle(style)
    window.show()
    sys.exit(app.exec())
票数 1
EN

Stack Overflow用户

发布于 2021-08-22 18:37:00

您可能会发现QStyleSheets对于类似的事情很有用。

我在styleSheet中通过在styleSheet属性中输入以下内容(在代码中要执行mywidget.setStyleSheet('<parameters>') )来模拟这一点:

代码语言:javascript
复制
QLineEdit {
    border: 3px solid red;
}
QLineEdit:focus {
    border: 3px solid green;
}

编辑:上面的styleSheet字符串适用于焦点,但最初的问题是关于enterEvent/leaveEvent的,后者在鼠标悬停时触发。正如@musicamente正确地指出的,要处理鼠标悬停,可以使用:hover 伪态而不是:focus

代码语言:javascript
复制
QLineEdit {
    border: 3px solid red;
}
QLineEdit:hover {
    border: 3px solid green;
}

我用2 QMainWindow做了一个QLineEdits: 1有styleSheet集,另一个是默认的。当焦点移动到常规QLineEdit时,修改后的QLineEdit会变成红色。

通过编辑父的styleSheet,您可以使QLineEdits的所有styleSheet行为相同。在您的情况下,您可以使用window.setStyleSheet('....。下面是Qt设计中的另一个模型:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68882878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档