Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: radislav72 от Декабрь 04, 2012, 12:34



Название: Цветовое оформление выделенной строки в QTableView
Отправлено: radislav72 от Декабрь 04, 2012, 12:34
Как изменить для одного QtableView параметры выделения строки/ячейки? По умолчанию используется синий фон и белые буквы. Как задать свой цвет фона и шрифта?


Название: Re: Цветовое оформление выделенной строки в QTableView
Отправлено: carrygun от Декабрь 04, 2012, 13:04
Поменять именно этому QTableView его QSS.


Название: Re: Цветовое оформление выделенной строки в QTableView
Отправлено: radislav72 от Декабрь 04, 2012, 14:55
А что задать в QSS?


Название: Re: Цветовое оформление выделенной строки в QTableView
Отправлено: Bepec от Декабрь 04, 2012, 15:02
задать свой цвет фона и шрифта.
Qt Assistant -> find -> Qt Style Sheet


Название: Re: Цветовое оформление выделенной строки в QTableView
Отправлено: radislav72 от Декабрь 04, 2012, 16:56
Спасибо, разобрался, но немного не подходит- нужно для разных столбцов по-разному задавать цвет выделения.

Можно ли как-то в коде ето обрабатывать?


Название: Re: Цветовое оформление выделенной строки в QTableView
Отправлено: Bepec от Декабрь 04, 2012, 17:34
Отдавать role каждому столбцу. По идее должно прокатить. В функции data модели.


Название: Re: Цветовое оформление выделенной строки в QTableView
Отправлено: radislav72 от Декабрь 04, 2012, 18:36
Может, я не правильно понял... Что значит "отдавать role"?

Я в data как раз и обрабатываю каждый столбец отдельно. И сами столбцы- разноцветные, как и должно быть. Но выделение рисуется отдельно от моего кода, и всегда получается белым текстом на синем фоне. А нужно для некоторых столбцов хотя бы цвет текста изменять.

То-есть получается так:
(http://fotky.com.ua/users/1712/121204/jjqmr_large.jpg) (http://fotky.com.ua/view/full/128394_lkohu)

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


Название: Re: Цветовое оформление выделенной строки в QTableView
Отправлено: water от Декабрь 04, 2012, 18:45
Попробй с помощью CSS:

//Задание стиля для активной ячейки
ui->tableView->setStyleSheet(
                "QTableView::item:selected:active {"
                "background: rgb(191, 255,191);"
                "border: 1px solid transparent;"
                "selection-color: #f00;"
                "}"

                "QTableView::item:selected:!active {"
                "background: rgb(191, 255,191);"
                "border: 1px solid transparent;"
                "selection-color: #f00;"
                "}"
                );


Название: Re: Цветовое оформление выделенной строки в QTableView
Отправлено: radislav72 от Декабрь 04, 2012, 19:36
Цитировать
water
Да, так можно сделать...
Но хотелось бы вариант в коде, так как нужно анализировать данные в строке выделения, и выделять в зависимости от данных- по-разному.


Название: Re: Цветовое оформление выделенной строки в QTableView
Отправлено: kambala от Декабрь 04, 2012, 21:03
model.setData()


Название: Re: Цветовое оформление выделенной строки в QTableView
Отправлено: radislav72 от Декабрь 05, 2012, 08:20
Цитировать
model.setData()

А как из модели узнать, какая строка в данный момент выделена (должна быть выделена)?


Название: Re: Цветовое оформление выделенной строки в QTableView
Отправлено: carrygun от Декабрь 05, 2012, 09:03
Цитировать
model.setData()

А как из модели узнать, какая строка в данный момент выделена (должна быть выделена)?

Об этом должна знать вьюха: QAbstractItemView::currentIndex.


Название: Re: Цветовое оформление выделенной строки в QTableView
Отправлено: radislav72 от Декабрь 05, 2012, 09:25
Как-то не очень хорошо из модели делать ссылку на представление... Но другого пути вроде нет?


Название: Re: Цветовое оформление выделенной строки в QTableView
Отправлено: carrygun от Декабрь 05, 2012, 10:09
Возможно, стоит посмотреть в сторону QStyledItemDelegate::paint? Может поможет.


Название: Re: Цветовое оформление выделенной строки в QTableView
Отправлено: Bepec от Декабрь 05, 2012, 12:27
Зачем вам ссылка на представление? Сделайте в своей модели слот, который и будет получать номер выделенной строки.
Всё.
Никакой привязки к View не будет.


Название: Re: Цветовое оформление выделенной строки в QTableView
Отправлено: water от Декабрь 05, 2012, 14:57
Я выделяю строку в зависимости от значения в колонке следющим способом

//Header file
class myModel : public QSqlQueryModel
{
    Q_OBJECT
public:
    QVariant data(const QModelIndex &index,
                          int role = Qt::DisplayRole) const;

};

//source file
QVariant myModel::data(const QModelIndex &index,int role) const {
    QVariant value = QSqlQueryModel::data(index, role);

if (role==Qt::BackgroundColorRole){
       QModelIndex controlIndex ;
       controlIndex= index.sibling(index.row(), 6);// второй параметр это проверяемая колонка
       if (controlIndex.data(Qt::DisplayRole).toString()==QObject::trUtf8("Да"))
           return QColor(55,175,189) ; //Подсвечиваю всю строку
       return value;
    }

}


Ну а далее создаешь объект этого класса и работаешь с ним как с обычным объектом QSqlQueryModel


Название: Re: Цветовое оформление выделенной строки в QTableView
Отправлено: radislav72 от Декабрь 06, 2012, 12:13
Bepec
Спасибо, идею понял

water
А что делает index.sibling ? Что-то адекватно перевести с английского не смог... Создает дубликат индекса? Если да, то зачем?


Название: Re: Цветовое оформление выделенной строки в QTableView
Отправлено: kambala от Декабрь 06, 2012, 12:45
sibling — сосед, «брат»


Название: Re: Цветовое оформление выделенной строки в QTableView
Отправлено: radislav72 от Декабрь 06, 2012, 12:55
Я понимаю, что по-английски sibling- "родной брат/сестра", мне не понятно, что делает метод sibling


Название: Re: Цветовое оформление выделенной строки в QTableView
Отправлено: radislav72 от Декабрь 06, 2012, 13:06
water
Так можно подсветить невыделенную строку, но стандартное выделение "перекрывает" то что прописать таким образом в коде, потому для выделения нужен другой способ


Название: Re: Цветовое оформление выделенной строки в QTableView
Отправлено: evgeniy от Август 05, 2014, 21:28
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));