def paint(self, painter, option, index): rect = QRect(option.rect) is_selected = index.data(VariableSelectionModel.IsSelected) full_selection = index.model().sourceModel().is_full() if option.state & QStyle.State_MouseOver: if not full_selection or (full_selection and is_selected): txt = [" 添加 ", " 删除 "][is_selected] txtw = painter.fontMetrics().horizontalAdvance(txt) painter.save() painter.setPen(Qt.NoPen) painter.setBrush(option.palette.brush(QPalette.Button)) brect = QRect( rect.x() + rect.width() - 8 - txtw, rect.y(), txtw, rect.height() ) painter.drawRoundedRect(brect, 4, 4) painter.setPen(option.palette.color(QPalette.ButtonText)) painter.drawText(brect, Qt.AlignCenter, txt) painter.restore() painter.save() double_pen = painter.pen() double_pen.setWidth(2 * double_pen.width()) if is_selected: next = index.sibling(index.row() + 1, index.column()) if not next.isValid(): painter.setPen(double_pen) painter.drawLine(rect.bottomLeft(), rect.bottomRight()) elif not next.data(VariableSelectionModel.IsSelected): painter.drawLine(rect.bottomLeft(), rect.bottomRight()) elif not index.row(): down = QPoint(0, painter.pen().width()) painter.setPen(double_pen) painter.drawLine(rect.topLeft() + down, rect.topRight() + down) else: prev = index.sibling(index.row() - 1, index.column()) if prev.data(VariableSelectionModel.IsSelected): painter.drawLine(rect.topLeft(), rect.topRight()) painter.restore() super().paint(painter, option, index)
def paint(self, painter, option, index): rect = QRect(option.rect) is_selected = index.data(VariableSelectionModel.IsSelected) if option.state & QStyle.State_MouseOver: txt = [" Add ", " Remove "][is_selected] txtw = painter.fontMetrics().width(txt) painter.save() painter.setPen(Qt.NoPen) painter.setBrush(QColor("#ccc")) brect = QRect(rect.x() + rect.width() - 8 - txtw, rect.y(), txtw, rect.height()) painter.drawRoundedRect(brect, 4, 4) painter.restore() painter.drawText(brect, Qt.AlignCenter, txt) painter.save() double_pen = painter.pen() double_pen.setWidth(2 * double_pen.width()) if is_selected: next = index.sibling(index.row() + 1, index.column()) if not next.isValid(): painter.setPen(double_pen) painter.drawLine(rect.bottomLeft(), rect.bottomRight()) elif not next.data(VariableSelectionModel.IsSelected): painter.drawLine(rect.bottomLeft(), rect.bottomRight()) elif not index.row(): down = QPoint(0, painter.pen().width()) painter.setPen(double_pen) painter.drawLine(rect.topLeft() + down, rect.topRight() + down) else: prev = index.sibling(index.row() - 1, index.column()) if prev.data(VariableSelectionModel.IsSelected): painter.drawLine(rect.topLeft(), rect.topRight()) painter.restore() super().paint(painter, option, index)
def __paintEventNoStyle(self): p = QPainter(self) opt = QStyleOptionToolButton() self.initStyleOption(opt) fm = QFontMetrics(opt.font) palette = opt.palette # highlight brush is used as the background for the icon and background # when the tab is expanded and as mouse hover color (lighter). brush_highlight = palette.highlight() if opt.state & QStyle.State_Sunken: # State 'down' pressed during a mouse press (slightly darker). background_brush = brush_darker(brush_highlight, 110) elif opt.state & QStyle.State_MouseOver: background_brush = brush_darker(brush_highlight, 95) elif opt.state & QStyle.State_On: background_brush = brush_highlight else: # The default button brush. background_brush = palette.button() rect = opt.rect icon_area_rect = QRect(rect) icon_area_rect.setRight(int(icon_area_rect.height() * 1.26)) text_rect = QRect(rect) text_rect.setLeft(icon_area_rect.right() + 10) # Background (TODO: Should the tab button have native # toolbutton shape, drawn using PE_PanelButtonTool or even # QToolBox tab shape) # Default outline pen pen = QPen(palette.color(QPalette.Mid)) p.save() p.setPen(Qt.NoPen) p.setBrush(QBrush(background_brush)) p.drawRect(rect) # Draw the background behind the icon if the background_brush # is different. if not opt.state & QStyle.State_On: p.setBrush(brush_highlight) p.drawRect(icon_area_rect) # Line between the icon and text p.setPen(pen) p.drawLine(icon_area_rect.topRight(), icon_area_rect.bottomRight()) if opt.state & QStyle.State_HasFocus: # Set the focus frame pen and draw the border pen = QPen(QColor(FOCUS_OUTLINE_COLOR)) p.setPen(pen) p.setBrush(Qt.NoBrush) # Adjust for pen rect = rect.adjusted(0, 0, -1, -1) p.drawRect(rect) else: p.setPen(pen) # Draw the top/bottom border if self.position == QStyleOptionToolBox.OnlyOneTab or \ self.position == QStyleOptionToolBox.Beginning or \ self.selected & \ QStyleOptionToolBox.PreviousIsSelected: p.drawLine(rect.topLeft(), rect.topRight()) p.drawLine(rect.bottomLeft(), rect.bottomRight()) p.restore() p.save() text = fm.elidedText(opt.text, Qt.ElideRight, text_rect.width()) p.setPen(QPen(palette.color(QPalette.ButtonText))) p.setFont(opt.font) p.drawText(text_rect, int(Qt.AlignVCenter | Qt.AlignLeft) | \ int(Qt.TextSingleLine), text) if not opt.icon.isNull(): if opt.state & QStyle.State_Enabled: mode = QIcon.Normal else: mode = QIcon.Disabled if opt.state & QStyle.State_On: state = QIcon.On else: state = QIcon.Off icon_area_rect = icon_area_rect icon_rect = QRect(QPoint(0, 0), opt.iconSize) icon_rect.moveCenter(icon_area_rect.center()) opt.icon.paint(p, icon_rect, Qt.AlignCenter, mode, state) p.restore()
def __paintEventNoStyle(self): p = QPainter(self) opt = QStyleOptionToolButton() self.initStyleOption(opt) fm = QFontMetrics(opt.font) palette = opt.palette # highlight brush is used as the background for the icon and background # when the tab is expanded and as mouse hover color (lighter). brush_highlight = palette.highlight() foregroundrole = QPalette.ButtonText if opt.state & QStyle.State_Sunken: # State 'down' pressed during a mouse press (slightly darker). background_brush = brush_darker(brush_highlight, 110) foregroundrole = QPalette.HighlightedText elif opt.state & QStyle.State_MouseOver: background_brush = brush_darker(brush_highlight, 95) foregroundrole = QPalette.HighlightedText elif opt.state & QStyle.State_On: background_brush = brush_highlight foregroundrole = QPalette.HighlightedText else: # The default button brush. background_brush = palette.button() rect = opt.rect icon_area_rect = QRect(rect) icon_area_rect.setRight(int(icon_area_rect.height() * 1.26)) text_rect = QRect(rect) text_rect.setLeft(icon_area_rect.right() + 10) # Background (TODO: Should the tab button have native # toolbutton shape, drawn using PE_PanelButtonTool or even # QToolBox tab shape) # Default outline pen pen = QPen(palette.color(QPalette.Mid)) p.save() p.setPen(Qt.NoPen) p.setBrush(QBrush(background_brush)) p.drawRect(rect) # Draw the background behind the icon if the background_brush # is different. if not opt.state & QStyle.State_On: p.setBrush(brush_highlight) p.drawRect(icon_area_rect) # Line between the icon and text p.setPen(pen) p.drawLine(icon_area_rect.topRight(), icon_area_rect.bottomRight()) if opt.state & QStyle.State_HasFocus: # Set the focus frame pen and draw the border pen = QPen(QColor(FOCUS_OUTLINE_COLOR)) p.setPen(pen) p.setBrush(Qt.NoBrush) # Adjust for pen rect = rect.adjusted(0, 0, -1, -1) p.drawRect(rect) else: p.setPen(pen) # Draw the top/bottom border if self.position == QStyleOptionToolBox.OnlyOneTab or \ self.position == QStyleOptionToolBox.Beginning or \ self.selected & \ QStyleOptionToolBox.PreviousIsSelected: p.drawLine(rect.topLeft(), rect.topRight()) p.drawLine(rect.bottomLeft(), rect.bottomRight()) p.restore() p.save() text = fm.elidedText(opt.text, Qt.ElideRight, text_rect.width()) p.setPen(QPen(palette.color(foregroundrole))) p.setFont(opt.font) p.drawText(text_rect, int(Qt.AlignVCenter | Qt.AlignLeft) | \ int(Qt.TextSingleLine), text) if not opt.icon.isNull(): if opt.state & QStyle.State_Enabled: mode = QIcon.Normal else: mode = QIcon.Disabled if opt.state & QStyle.State_On: state = QIcon.On else: state = QIcon.Off icon_area_rect = icon_area_rect icon_rect = QRect(QPoint(0, 0), opt.iconSize) icon_rect.moveCenter(icon_area_rect.center()) opt.icon.paint(p, icon_rect, Qt.AlignCenter, mode, state) p.restore()