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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не могу разобраться как применить QSS к строкам QTableWidget  (Прочитано 9343 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Январь 14, 2014, 21:18 »

Пытаюсь стилизовать Qt-приложение под Андроид.

Нужно сделать высокими, высотой минимум 32-42 пикселя строки в QTableWidget. Делаю это через QSS, для разных платформ свой QSS.

Максимум, чего смог добиться, представлено на картинке (см. вложение внизу). Видно, что к строкам коричневый цвет (brown) применяется и больше ничего. Видно, что синий цвет (blue) применяется к прочим элементам, в частности, к интересующим меня элементам нумерации строк.

QSS следующий:

Код
CSS
...
 
QTableWidget::item {
height: 32px;
min-height: 32px;
margin: 16px 0px 16px 0px;
color: brown;
}
 
 
QTableWidget * {
height: 32px;
min-height: 32px;
margin: 16px 0px 16px 0px;
color: blue;
}
 
...

А нужно просто сделать так, чтобы сверху и снизу строки таблицы были поля из указанного количества пикселей.

В QTreeView и QListView достаточно указать margin и строки "разряжаются" по вертикали:

QTreeView::item, QListView::item {
        margin: 8px 0px 8px 0px;
}

А для QTableWidget я и margin, и height, и min-height указываю, и толку никакого, хотя цвет применяется.
Записан

Собираю информацию по крупицам
http://webhamster.ru
carrygun
Гость
« Ответ #1 : Январь 15, 2014, 04:46 »

Я в таких случаях обычно переопределяю sizeHint() у QStyledItemDelegate, ну а потом у вьюхи setItemDelegate() собственно.
Например:
Код
C++ (Qt)
QSize QFriendItem::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
   QSize size = QStyledItemDelegate::sizeHint(option, index);
 
   size.rheight() = 44;
   return size;
}
 
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #2 : Январь 15, 2014, 09:53 »

Я в таких случаях обычно переопределяю sizeHint() у QStyledItemDelegate, ну а потом у вьюхи setItemDelegate() собственно.
Например:
Код
C++ (Qt)
QSize QFriendItem::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
   QSize size = QStyledItemDelegate::sizeHint(option, index);
 
   size.rheight() = 44;
   return size;
}
 

То есть, оформление хардкодите в код??
Записан

Собираю информацию по крупицам
http://webhamster.ru
carrygun
Гость
« Ответ #3 : Январь 15, 2014, 10:13 »

Конкретно высоту/ширину - да. То, что можно сделать средствами QSS - уношу в QSS. К слову недавно пришлось так же перекрывать paint() у QStyledItemDelegate. Потому что item'ы у вьюх нельзя настроить для конкретного столбца.
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #4 : Январь 15, 2014, 20:07 »

Конкретно высоту/ширину - да. То, что можно сделать средствами QSS - уношу в QSS. К слову недавно пришлось так же перекрывать paint() у QStyledItemDelegate. Потому что item'ы у вьюх нельзя настроить для конкретного столбца.

Вот смотри. Для QComboBox существует такая же проблема - не применяется стиль для выпадающего списка. Я обошел ее путем создания маленького класса-наследника QComboBox, в котором в качестве itemDelegate устанавливаю делегат, восприимчивый к QSS:

Код:
MtComboBox::MtComboBox(QWidget *parent) : QComboBox(parent)
{
 Q_UNUSED(parent);

 itemDelegate = new QStyledItemDelegate();
 this->setItemDelegate(itemDelegate);
}

MtComboBox::~MtComboBox()
{
 if(itemDelegate!=NULL)
  delete itemDelegate;
}

И стилизация выпадающего списка в QComboBox заработала нормально (Вместо QComboBox теперь пользуюсь MtComboBox).

Я попытался сделать то же самое и для QTableWidget:

Код:
MtTableWidget::MtTableWidget(QWidget *parent) : QTableWidget(parent)
{
 Q_UNUSED(parent);

 itemDelegate = new QStyledItemDelegate();
 this->setItemDelegate(itemDelegate);
}


MtTableWidget::~MtTableWidget()
{
 if(itemDelegate!=NULL)
  delete itemDelegate;
}

Однако у объекта MtTableWidget стилизация для ячеек так и не заработала.

Вот не могу придумать, что еще надо дописать чтоб применялись стили QSS. Хардкодить ширину-высоту-отступы в код не хочется, все-таки этим QSS должно управлять.



Записан

Собираю информацию по крупицам
http://webhamster.ru
carrygun
Гость
« Ответ #5 : Январь 16, 2014, 04:41 »

Можно было и не наследоваться, а написать в духе:
Код
C++ (Qt)
combo->setItemDelegate(new QStyledItemDelegate(combo));
 

Это ладно. Но я не особо в курсе насчет тонкостей QSS, единственно понятно, что полностью стилизовать приложение с его помощью не очень просто. Особенно забавно что много моментов в справке отложено на будущие релизы. Как вариант можно еще вот что попробовать: раз используется QTableWidget, то попробовать задать стили для QTableWidgetItem вместо ::item.
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #6 : Март 09, 2014, 20:51 »

Я в таких случаях обычно переопределяю sizeHint() у QStyledItemDelegate, ну а потом у вьюхи setItemDelegate() собственно.

А ты уверен, что такой способ работает для QTableView или QTableWidget?

Я сейчас сделал именно как ты сказал:

1. Сделал класс MtStyledItemDelegate как производный от QStyledItemDelegate:

Код:
#ifndef __MTSTYLEDITEMDELEGATE_H__
#define __MTSTYLEDITEMDELEGATE_H__

#include <QStyledItemDelegate>

class MtStyledItemDelegate : public QStyledItemDelegate
{
 Q_OBJECT
public:
 explicit MtStyledItemDelegate(QObject *parent = 0);

 QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;

signals:

public slots:

};

#endif // __MTSTYLEDITEMDELEGATE_H__

...

#include "MtStyledItemDelegate.h"

MtStyledItemDelegate::MtStyledItemDelegate(QObject *parent) : QStyledItemDelegate(parent)
{

}

QSize MtStyledItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QSize size = QStyledItemDelegate::sizeHint(option, index);

    size.rheight() = 45;
   
    return size;
}

2. Применил этот делегат к QTableView:


Код:
 tableView=new QTableView(this);

 MtStyledItemDelegate *itemDelegate = new MtStyledItemDelegate();
 tableView->setItemDelegate(itemDelegate);



И толку никакого. Высота ячеек не увеличилась.

Что я делаю не так?
Записан

Собираю информацию по крупицам
http://webhamster.ru
Kolobok
Гость
« Ответ #7 : Март 10, 2014, 21:34 »

Код:
tableView->verticalHeader()->setDefaultSectionSize(45);
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #8 : Март 11, 2014, 07:23 »

Код:
tableView->verticalHeader()->setDefaultSectionSize(45);

Мы говорим о строках таблицы, а не о заголовке.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Bepec
Гость
« Ответ #9 : Март 11, 2014, 08:49 »

Header есть вертикальный и горизонтальный.
Горизонтальный - столбцы, вертикальный - строки.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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