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


Автор: vlarry 31.3.2016, 13:42
Добрый день.
Как можно в делегате QTableWidget изменить цвет всей строки?

Спасибо.

Автор: ss 1.4.2016, 01:41
можно установить деледат для конкретной строки tableWidget->setItemDelegateForRow(row,delegate);
а в делегате есть 
Код

protected:
    void drawDisplay(QPainter *painter, const QStyleOptionViewItem &option,
                                 const QRect &rect, const QString &text) const;

в этом методе нарисовать прямоугольник с геометрией rect и заливкой и вывести текст text (или все что необходимо).


еще есть 
Код

void QItemDelegate::drawBackground(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const


можно использовать один  делегат для всей таблицы переопределив
Код

void QItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const

а в методе можно проверять index.column() и index.row() и выводить строки или отдельные айтамы нужными цветами (более подробно в хелпе Qt)

Так же можно установить цвет фона роль в моделе для каждого item строки таблицы
Код

    QStandardItemModel *model = (QStandardItemModel*)tableWidget->model();
    for(int i = 0; i < tableWidget->columnCount(); ++i
        model->setData(model->index(row,i),QColor("red"),Qt::BackgroundRole);

Автор: vlarry 1.4.2016, 08:41
Да я и так переопределил paint и назначаю свою роль и по этой роли меняю цвет строки. Проблема как оказалось в том, что у меня в 3х из пяти колонках выводятся изображения (или не выводятся - если нужно) QPixmap и когда мне не надо выводить изображение, то я устанавливаю пустой QPixmap() и это изображение перекрывает фон. Как создать прозрачный QPixmap, чтобы не перекрывать фон?

Автор: math64 1.4.2016, 10:00
Пустой Pixmap чёрного цвета (alpha=255) или прозрачный (alpha=0)? Нужно прозрачный.

Автор: vlarry 1.4.2016, 10:13
Цитата(math64 @ 1.4.2016,  10:00)
Пустой Pixmap чёрного цвета (alpha=255) или прозрачный (alpha=0)? Нужно прозрачный.

нужен полностью прозрачный, чтобы не перекрывать фон. Думал создать просто прозрачный QPixmap в редакторе, но думаю это не правильно....

Автор: math64 1.4.2016, 13:16
Ну, насколько я понимаю, создавать прозрачный QPixmap нужно так:
Код

QPixmap px(width,height);
px.fill(QColor(0,0,0,0));

Автор: ss 1.4.2016, 16:31
если пустой Pixmap то его можно вообще не рисовать. Поставить проверку на это.

Автор: vlarry 1.4.2016, 16:52
У меня в зависимости от условий (состояние объекта) выводятся иконки в колонках. И когда я установил иконку при некотором условии, то после изменения состояния мне ее необходимо убрать, т.е. я понимаю надо поставить другую (пустую). Попробую через QPixmpa::fill. Спасибо.

Автор: ss 1.4.2016, 17:40
Цитата

 надо поставить другую (пустую)


зачем ? QPixmаp же пустой ? QPixmаp все равно не будет видно. Это лишняя работа рисовать пустые элементы. Будут айтамы у которых будут установленные  QPixmаp и будут без айтамы без QPixmаp. 

Делегат не сохраняется для каждого айтама таблице. Он один для всех и на каждом новом цикле прорисовки таблицы его можно как угодно менять. т.е. указывать только то что нужно отобразить а в пустом QPixmаp смысла никакого нет

Автор: vlarry 1.4.2016, 18:18
Спасибо, а я подумал, что в QTableWidgetItem состояние сохраняется. Попробую. 

Автор: vlarry 2.4.2016, 09:56
Спасибо. Все получилось.

Автор: math64 4.4.2016, 08:05
Пустой пиксмап - место не занимет, текст у айтемов без пиксмапа сдвигается влево.
Прозрачный пиксмап - на экране не отображается, но место занимает. Если размеры всех пиксмапов одинаковы, текст будет начинаться с одного и того же места.
Прозрачный пиксмап можно добавить в таблицу, метод data(), или при прорисовке делегатом. Сохранять его в QTableWidgetItem - пустая трата памяти.

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