Я пытаюсь установить цвет границы флажков в QTableView.
Я пытался использовать setStyleSheet, но это просто переопределяет весь стиль флажка и снимает галочку:
table_view.setStyleSheet(
"""
QTableView::indicator:unchecked {
border: 2px solid red;
}
QTableView::indicator:checked {
border: 2px solid green;
}
"""
)
По сути, мне придется воссоздать таким образом весь флажок, угадать его свойства по умолчанию и найти способ поставить там галочку.
< hr />
Используя QStyleImageDelegate, я могу добиться некоторой настройки, не снимая галочку:
class CheckboxDelegate(QStyledItemDelegate):
def __init__(self, border_colour):
super().__init__()
self.border_colour = border_colour
def paint(self, painter, option, index):
if index.data(Qt.CheckStateRole) is not None:
checkbox_option = QStyleOptionButton()
checkbox_option.state |= QStyle.State_Enabled
checkbox_option.state |= (
QStyle.State_On if index.data(Qt.CheckStateRole) == Qt.Checked else QStyle.State_Off
)
# Draw custom boarder and checkbox
checkbox_option.rect = option.rect
painter.save()
painter.setPen(QColor(self.border_colour))
painter.drawRect(option.rect)
QApplication.style().drawControl(QStyle.CE_CheckBox, checkbox_option, painter)
painter.restore()
else:
super().paint(painter, option, index)
delegate = CheckboxDelegate('red')
table_view.setItemDelegateForColumn(1, delegate)
Но опять же, та же проблема: нужно переопределить весь стиль флажка, но изменить только одно свойство. Вот только это кажется излишне сложным.
Полный код:
from PySide6.QtCore import Qt, QAbstractTableModel
from PySide6.QtWidgets import (
QStyledItemDelegate,
QStyle,
QStyleOptionButton,
QApplication,
QTableView,
)
from PySide6.QtGui import QColor
class CheckboxDelegate(QStyledItemDelegate):
def __init__(self, border_colour):
super().__init__()
self.border_colour = border_colour
def paint(self, painter, option, index):
if index.data(Qt.CheckStateRole) is not None:
checkbox_option = QStyleOptionButton()
checkbox_option.state |= QStyle.State_Enabled
checkbox_option.state |= (
QStyle.State_On if index.data(Qt.CheckStateRole) == Qt.Checked else QStyle.State_Off
)
# Modify border color
checkbox_option.rect = option.rect
painter.save()
painter.setPen(QColor(self.border_colour))
painter.drawRect(option.rect)
QApplication.style().drawControl(QStyle.CE_CheckBox, checkbox_option, painter)
painter.restore()
else:
super().paint(painter, option, index)
class TableModel(QAbstractTableModel):
def __init__(self, data, headers, parent=None):
super().__init__(parent)
self._data = data
self._headers = headers
def rowCount(self, parent=None):
return len(self._data)
def columnCount(self, parent=None):
return len(self._headers)
def data(self, index, role):
if not index.isValid():
return None
value = self._data[index.row()][index.column()]
if role == Qt.DisplayRole:
return value
if role == Qt.CheckStateRole and index.column() == 1:
return Qt.Checked if value else Qt.Unchecked
return None
def headerData(self, section, orientation, role):
if role == Qt.DisplayRole:
if orientation == Qt.Horizontal:
return self._headers[section]
if orientation == Qt.Vertical:
return f"Row {section + 1}"
return None
def setData(self, index, value, role):
if not index.isValid():
return False
if role == Qt.CheckStateRole and index.column() == 1:
self._data[index.row()][index.column()] = bool(value)
self.dataChanged.emit(index, index, [role])
return True
return False
def flags(self, index):
if not index.isValid():
return Qt.NoItemFlags
if index.column() == 1:
return Qt.ItemIsEnabled | Qt.ItemIsUserCheckable
return Qt.ItemIsEnabled
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
data = [
["Row1", True],
["Row2", False],
["Row3", True],
]
headers = ["Text", "Checkbox"]
model = TableModel(data, headers)
table_view = QTableView()
table_view.setModel(model)
# # Set the style for QTableView checkboxes
# table_view.setStyleSheet(
# """
# QTableView::indicator:unchecked {
# border: 2px solid red;
# }
# QTableView::indicator:checked {
# border: 2px solid green;
# }
# """
# )
# # Set custom delegate for the checkbox column
# delegate = CheckboxDelegate("red")
# table_view.setItemDelegateForColumn(1, delegate)
table_view.show()
sys.exit(app.exec())
Подробнее здесь: https://stackoverflow.com/questions/793 ... t-overridi
Как установить свойства стиля флажков в QTableView, не переопределяя другие его свойства по умолчанию? ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Проблема с выравниванием флажков Vue.js: центрирование флажков внутри ячеек таблицы
Anonymous » » в форуме CSS - 0 Ответы
- 91 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Проблема с выравниванием флажков Vue.js: центрирование флажков внутри ячеек таблицы
Anonymous » » в форуме CSS - 0 Ответы
- 68 Просмотры
-
Последнее сообщение Anonymous
-