Russian Qt Forum
Ноябрь 26, 2024, 14:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: setStyleSheet и QTreeView  (Прочитано 6037 раз)
helga1917
Гость
« : Август 14, 2013, 15:01 »

Есть таблица со строками QTreeView
Код:
proxyView = new QTreeView;
Ей назначен одинаковый цвет строк - красный и цвет выделенной строки - белый. Если кликнуть на другую строку, то она станет веделенной - белой, а бывшая выделенная строка станет обратно красной.
Код:
proxyView->setStyleSheet("QTreeView::item {background-color: red}" //для всех строк
proxyView->setStyleSheet("QTreeView::item.selected {background-color: white;}");   //выделенная строка
 
Есть кнопка, при клике на которую, цвет выделенной белой строки должен измениться на зеленый и остаться таким, т.е. цвет этой строки больше изменяться не должен. Как этого добиться?
Код:
OkButton = new QPushButton;
connect (OkButton, SIGNAL (clicked()), this, SLOT(changeRow()));
Код:
void changeRow()
{
proxyView->setStyleSheet ("QTreeView::item:selected {background-color: green;}"); //это работает не правильно, цвет выделяемой строки изменяется на зеленый
}
Записан
helga1917
Гость
« Ответ #1 : Август 14, 2013, 15:13 »

что-то подобное тут: http://usefulscript.ru/highlight_table.php
 тоже при клике на строку ее цвет изменяется и остается, но это не qt
Записан
Bepec
Гость
« Ответ #2 : Август 14, 2013, 16:26 »

Вам не styleSheet нужен, а отдавать в модели в Data() роль BackgroundRole для нужных строк.

PS стайлшитом это сделать очень сложно.
Записан
helga1917
Гость
« Ответ #3 : Август 15, 2013, 09:41 »

изменила функцию changeRow(), но почему-то не работает:

Код:
void changeRow()
{
QModelIndex indexRow = proxyView->currentIndex();
proxyModel->setData(indexRow, QColor (Qt::red), Qt::BackgroundColorRole);
}
Записан
Bepec
Гость
« Ответ #4 : Август 15, 2013, 10:29 »

Возможно стоит перечитать моё сообщение? Веселый
Записан
helga1917
Гость
« Ответ #5 : Август 15, 2013, 10:41 »



отдавать в модели в Data() роль BackgroundRole для нужных строк.
с data() мне не понятно, как передать цвет???
Код:
void changeRow()
{
QModelIndex indexRow = proxyView->currentIndex();
proxyModel->data(indexRow,Qt::BackgroundColorRole);
}
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #6 : Август 15, 2013, 10:54 »

можно так попробовать:
Код
C++ (Qt)
class MyModel : ...
{
   ...
public:
   void addGreenIndex(const QModelIndex &index) { _greenIndeces += index; }
private:
   QSet _greenIndeces;
};
 
QVariant MyModel::data(const QModelIndex &index, int role) const
{
   switch (role)
   {
       case Qt::BackgroundRole:
           if (_greenIndeces.contains(index))
               return QColor(Qt::green);
   }
}
 
...
 
void MyWidget::changeRow()
{
   _model->addGreenIndex(proxyView->currentIndex());
}
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
helga1917
Гость
« Ответ #7 : Август 15, 2013, 12:49 »

kambala, выдает 2 ошибки:
Код:
public:
    void addGreenIndex(const QModelIndex &index) { _greenIndeces += index; }  //'_greenIndeces was not declared in this scope
                                                                             //In member function 'void MyModel::addGreenIndex(const QModelIndex&)':
private:
    QSet _greenIndeces;                                             //invalid use of template-name 'QSet' without an argument list
Записан
helga1917
Гость
« Ответ #8 : Август 15, 2013, 12:52 »

А как передать в setData() не одну ячейку, а всю строку? Можно как-нибудь сделать чтоб закрашивать не одну ячейку, а всю строку, без styleSheet?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #9 : Август 15, 2013, 14:19 »

kambala, выдает 2 ошибки:
Код:
public:
    void addGreenIndex(const QModelIndex &index) { _greenIndeces += index; }  //'_greenIndeces was not declared in this scope
                                                                             //In member function 'void MyModel::addGreenIndex(const QModelIndex&)':
private:
    QSet _greenIndeces;                                             //invalid use of template-name 'QSet' without an argument list

#include <QSet>
только код, который я написал, надо помещать в свой существующий класс модели, а не в новый. если у тебя нет отдельного класса модели, то унаследуйся от того, который сейчас используешь.
А как передать в setData() не одну ячейку, а всю строку? Можно как-нибудь сделать чтоб закрашивать не одну ячейку, а всю строку, без styleSheet?
просто собери все индексы для текущей строки
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
helga1917
Гость
« Ответ #10 : Август 15, 2013, 14:54 »

да, помещаю этот код в класс модели
это в хэдер модели:
Код:
#include <QSet> // подключен заголовок
public:
    void addGreenIndex(const QModelIndex &index) { greenIndeces += index; }
private:
    QSet greenIndeces;
это в срр:
Код:
QVariant MyModel::data(const QModelIndex &index, int role) const
{
    switch (role)
    {
        case Qt::BackgroundRole:
            if (greenIndeces.contains(index))
                return QColor(Qt::green);
    }
}
а это в другой срр
Код:
void MyWidget::changeRow()
{
    model->addGreenIndex(proxyView->currentIndex());
}

Но все равно ругается в хэдере, теми же ошибками Обеспокоенный
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #11 : Август 15, 2013, 14:57 »

Правильно вот так:
Код
C++ (Qt)
QSet<QModelIndex> greenIndeces;
Записан
helga1917
Гость
« Ответ #12 : Август 15, 2013, 15:05 »

заработало  Улыбающийся спасибо
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.084 секунд. Запросов: 23.