LINUX.ORG.RU

[Qt3][QTable]изменить свет строки/ячейки


0

1

Доброго времени суток. Мне нужно в таблице (QTable из Qt3), в зависимости от содержащейся в ячейках одного столбца инфы, менять цвет строки , содержащую ячейку с этой инфой. То есть, допустим, если в третьем столбце строки N содержится текст «Красный», менять цвет всех ячеек этой строки на красный. Гугл предлагает переопределить метод paint() или paintCell(), но проблема в том, что новые строки добавляются сверху, а старые сдвигаются на одну вниз, из-за чего придется перерисовывать всю таблицу, закрашивая строки по-новой: при добавлении новой строки в приведенный пример надо чтобы новая строк заняла позицию 0, а строка N переместилась на N+1, цвет строки N стал опять белым, а строка N+1 стала красной.

Вопрос в следующем : можно ли написать функцию

 setCellColor ( int row, int col, QColor &color )  //Закраска ячейки
или
 setRowColor ( int row,  QColor &color) // Закраска строки 

или можно каким-то другим способом закрашивать ячейки таблицы?

Прошу не разводить троллинга на тему «Qt3 - старая дрянь, пора переходить на Qt4», ибо на целевой ОС Qt4 просто нет и не предвидится в ближайшие N месяцев/лет.

★★
Ответ на: комментарий от Rapt0r

>МСВС наверно :)

Не, уютненькая слака 8.0, которую 5 лет настраивал и только вчера закончил «любовно настраивать ручками»

Led ★★★☆☆
()
Ответ на: комментарий от pozitiffcat

Может подскажете как это использовать? Я уже 4 часа пытаюсь закрасить хотя бы одну ячейку, но ничего не получается

Dikar ★★
() автор топика
Ответ на: комментарий от pozitiffcat

> создаешь экз класса QPainter

Там же дан указатель на QPainter первым аргументом.

rival ★★
()
Ответ на: комментарий от Dikar

делаешь дочерний класс от QTable переопределяешь функцию

public:
    void QTable::paintCell ( QPainter * p, int row, int col, const QRect & cr, bool selected, const QColorGroup & cg );
далее например
void MyTable::paintCell( QPainter * p, int row, int col, const QRect & cr, bool selected, const QColorGroup & cg)
{
    //условие если нужная ячейка то
    p->setBackground ( QBrush(QColor(255,0,0)) );
}
как то так

pozitiffcat ★★★
()
Ответ на: комментарий от pozitiffcat

Если переопределить paintCell таким образом, то таблица вообще перестаёт отрисовываться

Dikar ★★
() автор топика
Ответ на: комментарий от Dikar

правильно! перересовывай текст всей таблицы в этой функции вместе с бэграундом и т.п... вобщем я указал путь, копай, говорю сам щас потэстить это дело не могу...


class MyTable
...

public:
    void paintCell ( QPainter * p, int row, int col, const QRect & cr, bool selected, const QColorGroup & cg );

...

void MyTable::paintCell( QPainter * p, int row, int col, const QRect & cr, bool selected, const QColorGroup & cg)
{
    //условие если нужная ячейка то
        p->setBackground ( QBrush(QColor(255,0,0)));
    p->drawText(cr,this->text(row,col)); //для всех ячеек
}

pozitiffcat ★★★
()
Ответ на: комментарий от pozitiffcat

сделал вот так:

void Table::paintCell(QPainter *painter, int row, int col,
                          const QRect &cr, bool selected, const QColorGroup &cg)
    {
        QRect rect(0, 0, cr.width(), cr.height());
        
        painter -> setBackgroundColor(Qt :: red);

        if (selected) {
            painter->fillRect(rect, cg.highlight());
            painter->setPen(cg.highlightedText());
        } else {
            painter->fillRect(rect, cg.base());
            painter->setPen(cg.text());
        }
        painter->drawText(0, 0, cr.width(), cr.height(), AlignCenter, text(row, col));
    }

толку ноль. Пока буду копать дальше, но если будет внятное решение - напишите пожалуйста.

Dikar ★★
() автор топика
Ответ на: комментарий от Dikar
class Table : public QTable
{
  public:
    Table( int numRows, int numCols, QWidget * parent = 0, const char * name = 0 ) : QTable( numRows,     numCols, parent, name )
    {
        
    }
    
  void paintCell( QPainter *p, int row, int col, const QRect &cr, bool selected, const QColorGroup &cg )
  {
    QColorGroup cgNew = cg;
          
      
      if( row == 0) cgNew.setColor(QColorGroup::Base, QColor( 220, 220, 220 ) );
      else if( row == 1 ) cgNew.setColor(QColorGroup::Base, QColor( 200, 200, 200 ) );
      else cgNew.setColor(QColorGroup::Base, QColor( 170, 170, 170 ) );
      
      QTable::paintCell ( p, row, col, cr, selected, cgNew );
     
  }
    
    
};

80% рабочее должно быть

pozitiffcat ★★★
()
Ответ на: комментарий от Dikar

проблема решена, чуть позже напишу как

Dikar ★★
() автор топика
Ответ на: комментарий от pozitiffcat

с этой строкой все в поряке :) Ночью или завтра днем скину сюда полный код переопределенного класса ибо то что есть надо доработать, пока все выглядит как кривой костыль.

Dikar ★★
() автор топика
Ответ на: комментарий от pozitiffcat

Вдруг найдутся еще олдфаги и понадобится пример:

 
#ifndef CONTROLTABLE
#define CONTROLTABLE

#include <qtable.h>
#include <qcolor.h>
#include <qstring.h>
#include <qpainter.h>

class ControlTable : public QTable{
   
   Q_OBJECT
  
private:
      
   QColor controlColor; // Цвет выделенной строки
   QString controlString;  // Значение одного из полей контрольной строки
   int numControlCol;  // Номер колонки для проверки контрольного значения

public:
   /* Конструктор класса. Принимает цвет, строку для контроля и номер контрольной колонки */
   ControlTable ( int row, int col, QWidget *parent = 0, const QColor *const contColor = 0, const QString *const contString = 0, const int contCol = -1,  const char *name = 0)
      : QTable ( row, col, parent, name ){
   
   /* Установка значений контроля */
     if ( contColor ){
         controlColor = *contColor;
     } else {
       controlColor = QColor ( Qt :: white );
     }
   
   
     if ( contString ){
         controlString = *contString;
     } else {
      controlString = "";
     }
   
     numControlCol = contCol;
   }
   /* Конец конструктора */
   
   /* Перегруженный метод отрисовки ячеек */
   /* Выделяет контрольные строки цветом  controlColor, 
     если значене строки в столбце numControlCol совпадает с controlString */
   void paintCell ( QPainter * p, int row, int col, const QRect & cr, bool selected, const QColorGroup & cg ){
      QRect rect(0, 0, cr.width(), cr.height());
      
      QBrush qb = p -> brush();
      if( numControlCol != -1 && text(row, numControlCol) == controlString)
         p -> setBrush(controlColor);
      else
         p -> setBrush(QColor(Qt :: white));
      
      if (selected) {
         p -> setBrush(QColor(Qt :: gray));
        // p->fillRect(rect, cg.highlight());
         p->setPen(cg.highlightedText());
      } else {
        // p->fillRect(rect, cg.base());
         p->setPen(cg.text());
      }
      
      p -> drawRect(rect);
      
      p->drawText(0, 0, cr.width(), cr.height(), AlignCenter, text(row, col));
      
      
   }
   
};

#endif

Dikar ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.