Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QTableView (полупрозрачное выделение строки)
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Модель/Представление
kexby
День добрый.

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

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

Так же обнаружил, что выделение в QTreeView и только в стиле WindowsVista работает именно так как мне хотелось (через выделение виден цвет ячеек).
Очень хотелось бы добится аналогичного поведения при выделении в QTableView.
Скрины во вложениях.
Пример:
#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.
Litkevich Yuriy
у меня в стиле ХП, поведение не отличается от стиля виндовс, т.е. полупрозрачности не наблюдается.
(Qt 4.7)
kexby
Цитата(Litkevich Yuriy @ 26.12.2013, 20:09) *
у меня в стиле ХП, поведение не отличается от стиля виндовс, т.е. полупрозрачности не наблюдается.
(Qt 4.7)

А если в XP попробовать так:
    QTreeView* trv = new QTreeView(window);
    trv->setStyle(new QWindowsVistaStyle());
Litkevich Yuriy
Цитата(kexby @ 28.12.2013, 10:00) *
QWindowsVistaStyle()
насколько я знаю, для того, чтобы этот стиль подхватился, нужна сама Виста. По крайней мере на Вин2к стиль ВинХП не подхватывался (фабрика нулевой указатель возвращает, а если проверку не делаешь, то программа упадёт)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.