我试图覆盖QMenu
的paintEvent()
,使其具有圆角
上下文菜单应该是这样的
以下是我尝试过的代码,但没有显示任何内容:
from PyQt5 import QtWidgets, QtGui, QtCore
import sys
class Example(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Context menu')
self.show()
def contextMenuEvent(self, event):
cmenu = AddContextMenu(self)
newAct = cmenu.addAction("New")
openAct = cmenu.addAction("Open")
quitAct = cmenu.addAction("Quit")
action = cmenu.exec_(self.mapToGlobal(event.pos()))
class AddContextMenu(QtWidgets.QMenu):
def __init__(self, *args, **kwargs):
super(AddContextMenu, self).__init__()
self.painter = QtGui.QPainter(self)
self.setMinimumSize(150, 200)
self.pen = QtGui.QPen(QtCore.Qt.red)
#self.setStyleSheet('color:white; background:gray; border-radius:4px; border:2px solid white;')
def paintEvent(self, event) -> None:
self.pen.setWidth(2)
self.painter.setPen(self.pen)
self.painter.setBrush(QtGui.QBrush(QtCore.Qt.blue))
self.painter.drawRoundedRect(10, 10, 100, 100, 4.0, 4.0)
self.update()
#self.repaint()
#super(AddContextMenu, self).paintEvent(event)
def main():
app = QtWidgets.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
注意:设置样式表对我不起作用:
这就是我在使用样式表时得到的结果,它不是完全四舍五入的
这是@musicamante建议后的绘画活动(仅供他/她检查)
def paintEvent(self, event) -> None:
painter = QtGui.QPainter(self)
#self.pen.setColor(QtCore.Qt.white)
#painter.setFont(QtGui.QFont("times", 22))
#painter.setPen(self.pen)
#painter.drawText(QtCore.QPointF(0, 0), 'Hello')
self.pen.setColor(QtCore.Qt.red)
painter.setPen(self.pen)
painter.setBrush(QtCore.Qt.gray)
painter.drawRoundedRect(self.rect(), 20.0, 20.0)
在init()中
self.pen = QtGui.QPen(QtCore.Qt.red)
self.pen.setWidth(2)
在样式表中为顶级小部件(有自己“窗口”的小部件)设置边框半径是不够的
虽然克里斯蒂安·卡彻提出的solution很好,但需要考虑两个重要因素:
WA_TranslucentBackground
属性将不起作用李>FramelessWindowHint
,因为它可能会导致窗口管理器出现问题,因此只有在确保操作系统需要它(Windows)后才应设置它李>有鉴于此,每当不支持合成时,使用^{} 是正确的修复方法,这必须发生在
resizeEvent()
中。请注意,掩蔽是基于位图的,抗锯齿是不受支持的,因此根据边界半径,圆形边界有时有点难看此外,由于您需要自定义颜色,因此必须使用样式表,因为QMenu的自定义绘制很难实现
关于您的paintEvent实现的一些旁注,由于上述原因在本例中不是必需的,但仍然很重要(有些要点与已注释的代码部分有关,但您尝试了这些方面的事实值得一提):
paintEvent()
外部实例化:像您那样在__init__
中创建实例是一个严重错误,甚至可能导致崩溃。油漆工只能在收到油漆事件时创建,且不得重复使用。这显然使得将其设置为实例属性(self.painter
)毫无用处,因为在绘制事件之后没有实际理由访问它李>self.pen = QtGui.QPen(QtCore.Qt.red, 2)
),在paintEvent中连续设置它是无用的李>self.painter.setBrush(QtCore.Qt.blue)
李>self.update()
不应在paintEvent中调用(甚至不应self.repaint()
)。结果是未定义的,可能是危险的李>我不能评论paintEvent功能,但可以使用样式表实现圆角。必须修改某些qmenu属性才能禁用背景中的默认矩形,这会产生不需要的结果
下面是使用样式表+自定义标志(无框架+透明背景)的示例的修改版本:
相关问题 更多 >
编程相关推荐