Я нашел QGraphicsEllipseItem
, QGraphicsRectItem
и другие элементы, когда они были выбраны, Qt нарисует вокруг него пунктирную белую прямоугольную рамку (как на картинке ниже). Итак, Qt помещает QWidget
или использует метод paint
, чтобы нарисовать прямоугольник вокруг него?
И иногда я хочу изменить пунктирно-белый прямоугольник с другим стилем. Например, я хочу изменить цвет границы, стиль линии (ширина линии, цвет линии и т. д.) или даже его форму, я читаю документ Qt, а не нашел способ сделать это, так как я могу изменить выбранную по умолчанию границу?
Вы должны переопределить метод paint
:
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QColor, QPen
from PyQt5.QtWidgets import (
QApplication,
QGraphicsEllipseItem,
QGraphicsItem,
QGraphicsScene,
QGraphicsView,
QStyle,
)
class EllipseItem(QGraphicsEllipseItem):
def paint(self, painter, option, widget):
is_selected = option.state & QStyle.State_Selected
# Remove default paint from selection
option.state &= ~QStyle.State_Selected
super().paint(painter, option, widget)
if is_selected:
# custom paint
itemPenWidth = self.pen().widthF()
pad = itemPenWidth / 2
penWidth = 0
bgcolor = QColor("salmon")
painter.setPen(QPen(bgcolor, penWidth, Qt.SolidLine))
painter.setBrush(Qt.NoBrush)
painter.drawRect(self.boundingRect().adjusted(pad, pad, -pad, -pad))
painter.setPen(QPen(QColor("blue"), 0, Qt.DashLine))
painter.setBrush(Qt.NoBrush)
painter.drawRect(self.boundingRect().adjusted(pad, pad, -pad, -pad))
def main():
app = QApplication([])
scene = QGraphicsScene()
ellipse_item = EllipseItem(0, 0, 500, 500)
ellipse_item.setBrush(QColor("white"))
ellipse_item.setFlag(QGraphicsItem.ItemIsSelectable)
scene.addItem(ellipse_item)
view = QGraphicsView()
view.setScene(scene)
view.show()
app.exec_()
if __name__ == "__main__":
main()
Ключевым моментом является удаление выбранной по умолчанию границы. Большое спасибо.