2016-02-16 4 views
1

У меня есть то, на что я надеюсь, будет простым вопросом. Я хотел бы иметь таблицу, где, щелкая по ячейке, ее фон будет окрашен, а после щелчка снова - неокрашенным (обратно к белому). Идея идентична флажку, но мне не нужен флажок в моей ячейке (если только он не занимает пространство всей ячейки и не расставляет цвета, а не проверяет). Я зациклился на том, как проверить цвет фона ячейки? Если бы я хотел, чтобы другая ячейка получала один и тот же цвет, я подумал о том, чтобы взять цвет фона из цветной ячейки и просто использовать ее в другой ячейке. Я застрял. Я пробовал color(), brushStyle() и, возможно, больше (возможно, неправильно). Я уверен, что это легко для вас, парни :)PyQt4 получить цвет ячейки таблицы

EDIT Несомненно, извините. Я имею в виду QTableWidget, например, так:

table = QtGui.QTableWidget() 
table.setRowCount(3) 
table.setColumnCount(3) 

Я хотел бы получить, скажем, цвет первой ячейки. Я попытался с помощью:

table.setItem(0, 0, QtGui.QTableWidgetItem()) 
bg = table.item(0, 0).background().color() 

print ("R: " + str(bg.red()) + "; G: " + str(bg.green()) + " ; B: " + str(bg.blue())) 

Я ожидал получить 255 на все значения RGB, так как я считаю, фон по умолчанию должен быть белым. Цвет по умолчанию белый или нет цвета по умолчанию? Я получаю все нули с этим кодом. Я просто хочу, чтобы иметь возможность сделать заявление:

if (cell is colored) 
    set cell background to white (default) 
else 
    set color to cell background 

EDIT 2: Хорошо так, мне удалось создать решение самостоятельно. Проводя его здесь для любого, кто в этом нуждается, хотя я считаю, что решение не будет большим и, возможно, не будет работать для других целей, кроме моего.

def clickTable(row, column): 

     if table.item(row, column) == None: 
      item1 = QtGui.QTableWidgetItem() 
      item1.setBackground(QtGui.QColor(100,100,150)) 
      table.setItem(row, column ,item1) 
     else: 
      table.takeItem(row, column) 

Код отвечает:

table.cellClicked.connect(clickTable) 

Я знаю, что takeItem может сделать этот код бесполезным для большинства людей, но работал для меня.

+0

Вы должны быть более точными. Что такое «таблица»? Это QTableView? QTableWidget? У вас есть модель? Какая модель? Дайте нам образец вашего кода, который поможет нам помочь вам. – Controlix

ответ

1

Для изменения цвета фона и текста в отдельных ячейках мне всегда приходилось использовать QItemDelegates, так как обычные методы палитр и таблиц стилей, похоже, не предоставляют методы для стилизации отдельных ячеек.

По существу, вы можете определить персонализированные роли данных (ItemBackgroundColorRole в этом случае) и установить данные для этих настраиваемых ролей для элементов в виджету вашей таблицы. QItemDelegate отвечает за рисование виджета таблицы, и мы можем переопределить метод paint, чтобы проверить эти пользовательские роли данных и изменить цвета, которые использует художник.

class MyDelegate(QItemDelegate): 

    ItemBackgroundColorRole = Qt.UserRole + 1 

    def __init__(self, parent, table): 
     super(MyDelegate, self).__init__(parent) 
     self.table = table 

    def paint(self, painter, option, index): 
     painter.save() 
     item = self.table.itemFromIndex(index) 
     if item: 
      bg_color = item.data(MyDelegate.ItemBackgroundColorRole) 
      if bg_color: 
       # These two roles (Window, Base) both style different aspects of the "background" 
       # Try with one or both to see which works for you 
       option.palette.setColor(QPalette.Window, bg_color) 
       option.palette.setColor(QPalette.Base, bg_color) 
     super(MyDelegate, self).paint(painter, option, index) 
     painter.restore() 


table = QtGui.QTableWidget() 
delegate = MyDelegate(None, table) 
table.setItemDelegate(delegate) 

item = QTableWidgetItem() 
item.setData(MyDelegate.ItemBackgroundColorRole, QColor(Qt.red)) 

# To clear the color and go back to default 
item.setData(MyDelegate.ItemBackgroundColorRole, None) 

Чтобы вызвать это на мобильный мыши, подключить к сигналу QTableWidget cellClicked.

table.cellClicked.connect(handle_click) 

def handle_click(row, column): 
    item = table.item(row, column) 
    bg_color = item.data(MyDelegate.ItemBackgroundColorRole) 
    color = None if bg_color else QColor(Qt.red) 
    item.setData(MyDelegate.ItemBackgroundColorRole, color) 
+0

Я применил ваш код, добавив QtCore и QtGui, где это было необходимо, и я получаю: 'NameError: name' MyDelegate 'не определен' на строке * super (MyDelegate, self) .__ init __ (parent) *. Возможно, я что-то пропустил, хотя –

+0

Вы назвали свой класс делегатов MyDelegate? –

+1

Я также исправил опечатку (я использовал дерево вместо таблицы) –

Смежные вопросы