Я пытаюсь установить цвет границы флажков в 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
Программы на Python
1737159301
Anonymous
Я пытаюсь установить цвет границы флажков в 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)
Но опять же, та же проблема: нужно переопределить весь стиль флажка, но изменить только одно свойство. Вот только это кажется излишне сложным.
[b]Полный код:[/b]
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())
Подробнее здесь: [url]https://stackoverflow.com/questions/79366177/how-do-i-set-the-style-properties-of-checkboxes-in-a-qtableview-without-overridi[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия