Russian Qt Forum

Qt => Вопросы новичков => Тема начата: helga1917 от Август 14, 2013, 15:01



Название: setStyleSheet и QTreeView
Отправлено: 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;}"); //это работает не правильно, цвет выделяемой строки изменяется на зеленый
}


Название: Re: setStyleSheet и QTreeView
Отправлено: helga1917 от Август 14, 2013, 15:13
что-то подобное тут: http://usefulscript.ru/highlight_table.php
 тоже при клике на строку ее цвет изменяется и остается, но это не qt


Название: Re: setStyleSheet и QTreeView
Отправлено: Bepec от Август 14, 2013, 16:26
Вам не styleSheet нужен, а отдавать в модели в Data() роль BackgroundRole для нужных строк.

PS стайлшитом это сделать очень сложно.


Название: Re: setStyleSheet и QTreeView
Отправлено: helga1917 от Август 15, 2013, 09:41
изменила функцию changeRow(), но почему-то не работает:

Код:
void changeRow()
{
QModelIndex indexRow = proxyView->currentIndex();
proxyModel->setData(indexRow, QColor (Qt::red), Qt::BackgroundColorRole);
}


Название: Re: setStyleSheet и QTreeView
Отправлено: Bepec от Август 15, 2013, 10:29
Возможно стоит перечитать моё сообщение? :D


Название: Re: setStyleSheet и QTreeView
Отправлено: helga1917 от Август 15, 2013, 10:41


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


Название: Re: setStyleSheet и QTreeView
Отправлено: kambala от Август 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());
}


Название: Re: setStyleSheet и QTreeView
Отправлено: helga1917 от Август 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


Название: Re: setStyleSheet и QTreeView
Отправлено: helga1917 от Август 15, 2013, 12:52
А как передать в setData() не одну ячейку, а всю строку? Можно как-нибудь сделать чтоб закрашивать не одну ячейку, а всю строку, без styleSheet?


Название: Re: setStyleSheet и QTreeView
Отправлено: kambala от Август 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?
просто собери все индексы для текущей строки


Название: Re: setStyleSheet и QTreeView
Отправлено: helga1917 от Август 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());
}

Но все равно ругается в хэдере, теми же ошибками :-[


Название: Re: setStyleSheet и QTreeView
Отправлено: Hellraiser от Август 15, 2013, 14:57
Правильно вот так:
Код
C++ (Qt)
QSet<QModelIndex> greenIndeces;


Название: Re: setStyleSheet и QTreeView
Отправлено: helga1917 от Август 15, 2013, 15:05
заработало  :) спасибо