Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > окрашивание ячейки таблицы


Автор: kuvshinka 5.12.2013, 14:55
Мне надо написать функцию, окрашивающую заданную ячейку таблицы заданным цветом. Цвет должен задаваться как в таблице стилей (css).
Я делаю так
Код

void func1(inr row, int column, QString color)
{

 if (color==»Black»)
  tablewidget->setStyleSheet{«QTableWidget  {selection-background-color: rgb(0,0,0);}»};

 if (color==»Red»)
  tablewidget->setStyleSheet{«QTableWidget  {selection-background-color: rgba(255,0,0,200);}»};

 if (color==»Blue»)
  tablewidget->setStyleSheet{«QTableWidget  {selection-background-color: rgba(0,0,255,150);}»};

tablewidget->item(row,column)->setSelected(true);

}

но как мне, например, переключиться именно c черного цвета на синий, т.е. как запомнить текущий цвет ячейки, задаваемый вышеуказанным способом — дополнительно заводить строковый двумерный массив, хранящий цвета всех ячеек? И вообще, оптимален ли (единственен ли) метод окрашивания заданной ячейки, приведенный выше, учитывая, что цвет должен задаваться как в таблице стилей, а не как QColor(0,0,0)?

Автор: math64 5.12.2013, 15:07
Таблицей стилей можно задать цвет всех ячеек таблицы, цвет выделеннной ячейки, цвет отдельно чётных и нечётных строк, но не конкретных ячеек.
Для прорисовки ячеек используется делегат и если назначить свой, в методе
viod paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
можно подменить параметр option

Автор: kuvshinka 5.12.2013, 21:02
ну вот я и пытаюсь задать цвет конкретной ячейке путем ее выделения, для чего использую метод setSelected и соответствующий стиль (секцию selection-background-color). подскажите пож-та пример с подменой параметра в своем делегате...

Автор: math64 5.12.2013, 22:29
Поскольку используется QTableWidget,можно так:
Код

#include <QtGui/QApplication>
#include <QtGui/QTableWidget>
#include <QtGui/QLabel>
#include <QtCore/QString>

char* css[2][2] = {
{"background-color: rgb(255,255,255);","background-color: rgb(255,0,0);"},
{"background-color: rgb(0,255,0);","background-color: rgb(0,0,255);"}
};
int main(int argc, char** argv)
{
  QApplication app(argc, argv);
  QTableWidget table(2,2);
  for(int x=0; x<2; x++)
    for(int y=0; y<2; y++) {
     QLabel* label = new QLabel(&table);
     label->setText(QString("%1 %2").arg(x).arg(y));
     label->setStyleSheet(css[x][y]);
     table.setCellWidget(x,y,label);
  }
  table.show();
  return app.exec();
}

Автор: kuvshinka 9.12.2013, 20:59
math64: Вы предлагаете нужные мне ячейки забить обычными QLabel-ми? но мне надо иметь возможность кликать на них, а у QLabel нет метода OnClick()...

Автор: math64 10.12.2013, 07:13
Можно заполнить кнопками или другими подходящими виджетами

Автор: kuvshinka 11.12.2013, 21:32
По поводу объединения ячеек в заголовках таблицы нашла пример:
Код

class MyHeaderModel : public QAbstractItemModel
{
public:
  MyHeaderModel(QObject *parent = 0) : QAbstractItemModel(parent) {}
  int columnCount(const QModelIndex &parent = QModelIndex()) const { return 5; }
  QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const { return QVariant(); }
  QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const { return QModelIndex(); }
  QModelIndex parent(const QModelIndex &index) const { return QModelIndex(); }
  int rowCount(const QModelIndex &parent = QModelIndex()) const { return 0; }
};

class MyHeader : public QHeaderView
{
  Q_OBJECT

 public:
    MyHeader(QHeaderView *header) : QHeaderView(Qt::Horizontal, header), mainHeader(header)
    {
      setModel(new MyHeaderModel(this));
        resizeSection(0, getSectionSizes(0, 2));
        resizeSection(1, getSectionSizes(3, 5));
        setGeometry(0, 0, header->width(), header->height());
        mainHeader->installEventFilter(this);
    }

protected:

    bool eventFilter(QObject *o, QEvent *e)
    {
     if (o == mainHeader)
     {
      if (e->type() == QEvent::Resize)
      {
       setOffset(mainHeader->offset());
       setGeometry(0, 0, mainHeader->width(), mainHeader->height());
      }
      return false;
     }
     return QHeaderView::eventFilter(o, e);
    }

private:

    int getSectionSizes(int first, int second)
    {
     int size = 0;
      for (int a=first; a<=second; ++a)
        size += mainHeader->sectionSize(a);
     return size;
    }

    QHeaderView *mainHeader;
};

В основном мне все в нем понятно (кроме, наверное, необходимости класса MyHeaderModel), но как мне его модифицировать, чтобы получить заголовок вида с возможностью клика по ячейкам С1...С4 и изменением их цвета - см. рисунок

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)