QItemDelegate 在 QCalendarWidget 列中的呈现方式不同
The QItemDelegate is not rendered in the same way across columns QCalendarWidget
我尝试在我的 QCalendarWidget 的单元格中创建一个角。所以我做了一个 QItemDelegate,我在里面画了我的三角形。
如屏幕截图所示,代理在第一列上工作正常,但在其他列上完全损坏。
我不明白这是从哪里来的(我是 Qt 的新手,所以也许我做错了什么)。
这是代码:
# ---------------------------------
# ------ CalendarDayDelegate ------
class CalendarDayDelegate(QItemDelegate):
def __init__(self, parent=None, projects=None):
super(CalendarDayDelegate, self).__init__(parent=parent)
self.projects = projects
def paint(self, painter, option, index):
painter._date_flag = index.row() > 0
super(CalendarDayDelegate, self).paint(painter, option, index)
if painter._date_flag:
rect = option.rect
corner = QPolygon([
rect.topRight(),
QPoint(rect.center().x() + (rect.center().x() / 2), rect.top()),
QPoint(rect.bottomRight().x(), rect.center().y())
])
painter.save()
painter.setRenderHint(painter.Antialiasing)
painter.setBrush(QBrush(QColor(Qt.darkGreen)))
painter.setPen(QPen(QColor(Qt.darkGreen)))
painter.drawPolygon(corner)
painter.restore()
def drawDisplay(self, painter, option, rect, text):
if painter._date_flag:
option.displayAlignment = Qt.AlignTop | Qt.AlignLeft
super(CalendarDayDelegate, self).drawDisplay(painter, option, rect, text)
# ----------------------
# ------ Calendar ------
class MonthReviewCalendar(QCalendarWidget):
def __init__(self, parent=None):
super(MonthReviewCalendar, self).__init__(parent=parent)
self._init_calendar()
def _init_calendar(self):
self.setVerticalHeaderFormat(
self.verticalHeaderFormat().NoVerticalHeader
)
self.setFirstDayOfWeek(Qt.Monday)
self.calendar_view = self.findChild(
QTableView, "qt_calendar_calendarview"
)
self.calendar_delegate = CalendarDayDelegate(
projects=self._raw_projects
)
self.calendar_view.setItemDelegate(self.calendar_delegate)
以及截图
问题出在多边形的第二个点上:由于您是根据 中心 的 x
设置它,table 将有一个不同的坐标参考。
如果你只打印矩形,你会看到结果:
def paint(self, painter, option, index):
# ...
if index.row() == 1:
print(index.column(), rect.center())
将输出:
>>> 0 PyQt5.QtCore.QPoint(<b>15</b>, 41)
>>> 1 PyQt5.QtCore.QPoint(<b>46</b>, 41)
>>> 2 PyQt5.QtCore.QPoint(<b>77</b>, 41)
>>> 3 PyQt5.QtCore.QPoint(<b>108</b>, 41)
>>> 4 PyQt5.QtCore.QPoint(<b>139</b>, 41)
因为你每次都添加一半的“中心x
”坐标,结果是每次你得到基于非零列的新矩形。
如果你想让那个角从矩形宽度的 75% 开始,只需使用右上角作为参考,然后 subtract/add 相对坐标 (QPoint) from/to 它:
ref = rect.topRight()
corner = QPolygon([
ref,
ref + QPoint(-rect.width() / 4, 0),
ref + QPoint(0, rect.height() / 2)
])
我尝试在我的 QCalendarWidget 的单元格中创建一个角。所以我做了一个 QItemDelegate,我在里面画了我的三角形。
如屏幕截图所示,代理在第一列上工作正常,但在其他列上完全损坏。
我不明白这是从哪里来的(我是 Qt 的新手,所以也许我做错了什么)。
这是代码:
# ---------------------------------
# ------ CalendarDayDelegate ------
class CalendarDayDelegate(QItemDelegate):
def __init__(self, parent=None, projects=None):
super(CalendarDayDelegate, self).__init__(parent=parent)
self.projects = projects
def paint(self, painter, option, index):
painter._date_flag = index.row() > 0
super(CalendarDayDelegate, self).paint(painter, option, index)
if painter._date_flag:
rect = option.rect
corner = QPolygon([
rect.topRight(),
QPoint(rect.center().x() + (rect.center().x() / 2), rect.top()),
QPoint(rect.bottomRight().x(), rect.center().y())
])
painter.save()
painter.setRenderHint(painter.Antialiasing)
painter.setBrush(QBrush(QColor(Qt.darkGreen)))
painter.setPen(QPen(QColor(Qt.darkGreen)))
painter.drawPolygon(corner)
painter.restore()
def drawDisplay(self, painter, option, rect, text):
if painter._date_flag:
option.displayAlignment = Qt.AlignTop | Qt.AlignLeft
super(CalendarDayDelegate, self).drawDisplay(painter, option, rect, text)
# ----------------------
# ------ Calendar ------
class MonthReviewCalendar(QCalendarWidget):
def __init__(self, parent=None):
super(MonthReviewCalendar, self).__init__(parent=parent)
self._init_calendar()
def _init_calendar(self):
self.setVerticalHeaderFormat(
self.verticalHeaderFormat().NoVerticalHeader
)
self.setFirstDayOfWeek(Qt.Monday)
self.calendar_view = self.findChild(
QTableView, "qt_calendar_calendarview"
)
self.calendar_delegate = CalendarDayDelegate(
projects=self._raw_projects
)
self.calendar_view.setItemDelegate(self.calendar_delegate)
以及截图
问题出在多边形的第二个点上:由于您是根据 中心 的 x
设置它,table 将有一个不同的坐标参考。
如果你只打印矩形,你会看到结果:
def paint(self, painter, option, index):
# ...
if index.row() == 1:
print(index.column(), rect.center())
将输出:
>>> 0 PyQt5.QtCore.QPoint(<b>15</b>, 41)
>>> 1 PyQt5.QtCore.QPoint(<b>46</b>, 41)
>>> 2 PyQt5.QtCore.QPoint(<b>77</b>, 41)
>>> 3 PyQt5.QtCore.QPoint(<b>108</b>, 41)
>>> 4 PyQt5.QtCore.QPoint(<b>139</b>, 41)
因为你每次都添加一半的“中心x
”坐标,结果是每次你得到基于非零列的新矩形。
如果你想让那个角从矩形宽度的 75% 开始,只需使用右上角作为参考,然后 subtract/add 相对坐标 (QPoint) from/to 它:
ref = rect.topRight()
corner = QPolygon([
ref,
ref + QPoint(-rect.width() / 4, 0),
ref + QPoint(0, rect.height() / 2)
])