QTableWidget selection Color - PullRequest
       13

QTableWidget selection Color

1 голос
/ 08 апреля 2011

Я хочу, чтобы выбранные ячейки имели другой цвет фона.По умолчанию в выбранной ячейке есть только тонкое подчеркивание.

Я пробовал это:

table->setStyleSheet("QTableView {selection-background-color: #0000FF; selection-color: #00FF00;}

, но он изменяет только цвет, который отображается, когда указатель находится на ячейке.,После того, как указатель отсутствует, я выбираю ячейку по table->selectRow(selRow), там только подчеркивание.Вероятно, это выглядит иначе на других платформах.

Есть много тем с одинаковой темой, но большинство ответов использует приведенную выше таблицу стилей.Ничего не работает, только "moseover Color" меняется.

Заранее спасибо, С уважением, Матиас

Ответы [ 4 ]

1 голос
/ 06 августа 2014
class BackgroundDelegate : public QStyledItemDelegate {
public:
  explicit BackgroundDelegate(QObject *parent = 0)
      : QStyledItemDelegate(parent){}
  void paint(QPainter *painter, const QStyleOptionViewItem &option,
             const QModelIndex &index) const {
    // Fill the background before calling the base class paint
    // otherwise selected cells would have a white background
    QVariant background = index.data(Qt::BackgroundRole);
    if (background.canConvert<QBrush>())
        painter->fillRect(option.rect, background.value<QBrush>());
    // the comment below makes selection transparent
    //QStyledItemDelegate::paint(painter, option, index);
    // To draw a border on selected cells
    if(option.state & QStyle::State_Selected) {
        painter->save();
        QPen pen(Qt::black, 2, Qt::SolidLine, Qt::SquareCap, Qt::MiterJoin);
        int w = pen.width()/2;
        painter->setPen(pen);
        painter->drawRect(option.rect.adjusted(w,w,-w,-w));
        painter->restore();
    }
  }
};

затем table->setItemDelegateForColumn(2, new BackgroundDelegate(this));

1 голос
/ 06 августа 2014

Это то, что я сделал.

stylesheet =  "QTableView{selection-background-color: " + highlight + ";"
stylesheet +=     "selection-color: white; show-decoration-selected: 10}\n"
stylesheet += "QTableView::item:focus{border: 1px solid yellow;"
stylesheet +=     "background-color:"+highlight+"}"

table->setStyleSheet(stylesheet);

Выбранный цвет делает один элемент, который выбран, в то время как фокус элемента будет окрашивать остальные элементы, которые должны быть выделены.

Это работает для выбранных ячеек, например, для выбранной строки. Если вы хотите что-то для «наведения мыши», вам, возможно, придется использовать «hover» в таблице стилей. Надеюсь, что это может дать вам идеи.

0 голосов
/ 18 мая 2016
table->setStyleSheet("QTableView:item:selected {background-color: #XXYYZZ; color: #FFFFFF}\n"
                     "QTableView:item:selected:focus {background-color: #3399FF;}")

К сожалению, свойства "nofocus", по-видимому, нет, поэтому вам просто нужно установить цвет для всех выбранных элементов, а затем переопределить фокусированный цвет обратно по умолчанию.#3399FF - это то, что средство выбора цвета показало, что цвет фона подсветки по умолчанию был для моей настройки, поэтому я использовал это.Вы можете заменить любой понравившийся вам цвет.

color: #FFFFFF устанавливает цвет текста на что-то нестандартное, когда выделение теряет фокус.Это белый цвет для меня, когда у меня есть фокус, поэтому я просто сохраняю его белым, когда он теряет фокус.Вы можете использовать любой понравившийся вам цвет или удалить эту часть, чтобы использовать значение по умолчанию.

0 голосов
/ 09 апреля 2011

Вам нужно использовать пользовательский делегат, чтобы рисовать выбранные ячейки так, как вы хотите.

Посмотрите на метод QAbstractItemView::setItemDelegate() и класс QItemDelegate. Вам нужно переопределить метод QItemDelegate::paint(). Метод рисования принимает структуру QStyleOptionViewItem - вы можете использовать ее, чтобы определить, выбран ли элемент, который вас просят нарисовать.

Документы Qt для QItemDelegate::paint имеют пример кода, который делает именно это.

...