Как создать тень у окна и сгладить углы у QWidget?
Необходимо создать форму с скругленными углами и тенью. Сейчас это реализовано так, пример ниже.
Но с Qt.FramelessWindowHint пропадает стандартная тень у формы и drawRoundedRect рисует очень пиксельные углы. Как возможно более сглажено их нарисовать? И как "руками" можно добавить тень? Т.к. форма без рамки должна быть, то часто сливается с нижними окнами.
class MyWindow(QtWidgets.QWidget):
super(MyWindow, self).__init__()
self.setWindowTitle('Icon')
self.setWindowFlag(Qt.FramelessWindowHint)
self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
def paintEvent(self, ev):
painter = QtGui.QPainter(self)
painter.begin(self)
painter.setBrush(QColor(255, 255, 255))
painter.setPen(Qt.NoPen)
painter.drawRoundedRect(self.rect(), 10.0, 10.0)
painter.end()
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Как вариант:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class Container(QtWidgets.QWidget):
def __init__(self, window, parent=None):
super(Container, self).__init__(parent)
self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
lay = QtWidgets.QVBoxLayout(self)
lay.addWidget(window)
lay.setContentsMargins(10, 10, 10, 10)
shadow = QtWidgets.QGraphicsDropShadowEffect(self,
blurRadius=9.0,
color=QtGui.QColor(99, 255, 255),
offset=QtCore.QPointF(8.0, 8.0)
)
window.setGraphicsEffect(shadow)
def mousePressEvent(self, event):
self.oldPos = event.globalPos()
def mouseMoveEvent(self, event):
delta = QtCore.QPoint (event.globalPos() - self.oldPos)
self.move(self.x() + delta.x(), self.y() + delta.y())
self.oldPos = event.globalPos()
class Window(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('Icon')
self.setWindowFlag(QtCore.Qt.FramelessWindowHint)
self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
def paintEvent(self, ev):
painter = QtGui.QPainter(self)
painter.setRenderHint(QtGui.QPainter.Antialiasing)
painter.setBrush(QtGui.QColor(195, 195, 255))
painter.setPen(QtCore.Qt.NoPen)
painter.drawRoundedRect(self.rect(), 10.0, 10.0)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = Window()
container = Container(w)
container.resize(640, 480)
container.show()
sys.exit(app.exec_())
