powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Qt. QTableView (полупрозрачное выделение строки)
3 сообщений из 3, страница 1 из 1
Qt. QTableView (полупрозрачное выделение строки)
    #38513172
kexby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый.

Как сделать в QTableView полупрозрачное выделение текущей строки?

Необходимость в таком выделении возникла после того как, обнаружил что цвет ячеек, получаемый из модели методом data() для роли Qt::BackgroundRole, напрочь перекрывается цветом выделения строки. А хочется видеть всяческие раскраски даже для текущей строки. А если в модели будет 1 строка (т.е. она же текущая), то вообще цвет подкраски никогда не отобразится.
Исправить ситуцию с помощью стилей не получилось (назвачение цвета выделения с прозрачностью 30%):
Код: plaintext
1.
myTableView->setStyleSheet("QTableView::item {selection-color: black; selection-background-color: rgba(30, 144, 255, 30%);}");


Так же обнаружил, что выделение в Q Tree View и только в стиле WindowsVista работает именно так как мне хотелось (через выделение виден цвет ячеек).
Очень хотелось бы добится аналогичного поведения при выделении в QTableView.
Пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
#include <QtGui>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QDialog* window = new QDialog(0);
    window->setAttribute(Qt::WA_DeleteOnClose);
    window->resize(350,250);
    QVBoxLayout* lw = new QVBoxLayout(window);

    QTableView* tbv = new QTableView(window);
    tbv->setAlternatingRowColors(true);
    tbv->setSelectionMode(QAbstractItemView::SingleSelection);
    tbv->setSelectionBehavior(QAbstractItemView::SelectRows);
    tbv->verticalHeader()->setDefaultSectionSize(20);
    tbv->horizontalHeader()->setStretchLastSection(false);

    tbv->setStyleSheet("QTableView::item {selection-color: black; selection-background-color: rgba(30, 144, 255, 100);}");  //DodgerBlue
    lw->addWidget(tbv);

    QTreeView* trv = new QTreeView(window);
    trv->setAlternatingRowColors(true);
    trv->setSelectionMode(QAbstractItemView::SingleSelection);
    trv->setSelectionBehavior(QAbstractItemView::SelectRows);
    trv->header()->setStretchLastSection(false);

    lw->addWidget(trv);

    QStandardItemModel* model = new QStandardItemModel(3,3,window);
    model->setData(model->index(0,0), QVariant("abc"));
    model->setData(model->index(1,0), QVariant("Abc"));
    model->setData(model->index(2,0), QVariant("ABC"));
    model->setData(model->index(0,1), QVariant(10));
    model->setData(model->index(1,1), QVariant(0));
    model->setData(model->index(2,1), QVariant(-10));
    model->setData(model->index(0,2), QVariant(true));
    model->setData(model->index(1,2), QVariant(false));
    model->setData(model->index(2,2), QVariant(true));

    model->setData(model->index(1,0), QVariant(QBrush(Qt::red)), Qt::BackgroundRole);
    model->setData(model->index(1,1), QVariant(QBrush(Qt::yellow)), Qt::BackgroundRole);
    model->setData(model->index(1,2), QVariant(QBrush(Qt::green)), Qt::BackgroundRole);

    tbv->setModel(model);
    trv->setModel(model);

    window->show();

    return app.exec();
}


Скрины во вложении.

P.S. Гуглил, но решения так и не нашел
Использовал Qt 4.8.5.
...
Рейтинг: 0 / 0
Qt. QTableView (полупрозрачное выделение строки)
    #38545470
Emery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Действительно, в QTreeView и только в стиле WindowsVista реализовано полупрозрачное выделение строк, а в QTableView – нет. Однако ничто не мешает нам создать собственный стиль, который будет работать всегда. Свой пример мы делаем на базе авторского и статьи в Habrahabr «Создаем стиль интерфейса Qt на примере таблицы» . В этой статье нет прямого решения поставленной задачи, но наводку она дает хорошую.

Идея очень простая, мы определяем текущий цвет ячейки в переопределяемой функции Style::drawPrimitive() нашего класса Style и затем модифицируем его нужным образом. Вариантов модификации может быть множество, я выбрал простейший – стандартное затемнение, с некоторым параметром, текущего цвета фона ячейки. Вот ключевой код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
//==============================================================================
// Style::drawPrimitive()
//==============================================================================
void Style::drawPrimitive(QStyle::PrimitiveElement pe, const QStyleOption *option, QPainter *painter, const QWidget *widget) const {
  switch(pe) {
    //case PE_PanelItemViewRow:  // Область выделенного ряда таблицы
    case PE_PanelItemViewItem:  // Область выделенной ячейки таблицы
      if(const QStyleOptionViewItemV4 *opt = qstyleoption_cast<const QStyleOptionViewItemV4 *>(option)) {
        // Цвет особо закрашенного фона ячейки (в остальных случаях - черный цвет)
        QColor color = opt->backgroundBrush.color();

        // Определяем цветовую гамму
        int red = color.red();
        int green = color.green();
        int blue = color.blue();

        if(option->state & QStyle::State_Selected) {  // либо QStyle::State_HasFocus
          // Активные ячейки

          if(red + green + blue == 0) {  // Цвет фона черный (что верно и для любого базового либо альтернативного цветов ячеек)
            // Здесь нет особо закрашенных ячеек, т.е. это обычные либо альернативыне невыделенные ячейки

            // Определяем факт использования альтернативной расскраски ячеек
            if(opt->features & QStyleOptionViewItem::Alternate) {  // Альтернативно закрашиваемый ряд
              // Определяем цвет альтернативной расскраски
              color = opt->palette.alternateBase().color();
            } else {  // Обычно закрашиваемый ряд
              // Определяем цвет обычной расскраски
              color = opt->palette.background().color();  //  = opt->palette.base().color(); ?
            }

            // Определяем цветовую гамму
            red = color.red();
            green = color.green();
            blue = color.blue();

            // Получаем размер области, на которой будет отображаться текст
            //QRect textRect = subElementRect(SE_ItemViewItemText, opt, widget);

            // Выводим парметры цветов в ячейки
            //painter->drawText(textRect, QString("(%1,%2,%3)").arg(red).arg(green).arg(blue));
          }  // if(red + green + blue == 0)

          // Затемнение данного цвета с выбранным парметром затемнения по умолчанию
          painter->fillRect(opt->rect, QColor(red, green, blue).dark());  // = ..dark(200)
        } else {  // Неактивные ячейки (нет фокуса на таблице)
          QProxyStyle::drawPrimitive(pe, opt, painter, widget);
        }  // if(option->state & QStyle::State_Selected)
      } else {  // opt = NULL
        QProxyStyle::drawPrimitive(pe, opt, painter, widget);
      }  // if(const QStyleOptionViewItemV4 *opt = qstyleoption_cast<const QStyleOptionViewItemV4 *>(option))

      break;
    default:
      QProxyStyle::drawPrimitive(pe, option, painter, widget);

      break;
  }
}  // Style::drawPrimitive()



Пример скрина прилагается.
...
Рейтинг: 0 / 0
Qt. QTableView (полупрозрачное выделение строки)
    #38545471
Emery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А здесь приложен исходный код для Qt-5.2.0.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Qt. QTableView (полупрозрачное выделение строки)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]