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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Выравнивание DecorationRole  (Прочитано 9907 раз)
Termit
Самовар
**
Offline Offline

Сообщений: 144



Просмотр профиля WWW
« : Октябрь 28, 2011, 22:07 »

Есть QTableView, которой в качестве модели назначена QSqlQueryModel в которой, в свою очередь, в методе QSqlQueryModel::data устанавливается иконка для ячейки таблицы

Код
C++ (Qt)
if (role == Qt::DecorationRole)
{
   if (header(index.column()) == QObject::tr("State"))
   {
       QVariant value = QSqlQueryModel::data(index, Qt::DisplayRole);
       if (value.toInt() == 1)
           return QIcon(":/Yes.png");
       else
           return QIcon(":/No.png");
   }
}
 

Иконка отображается, все хорошо, но вот хочется чтобы эта иконка была выровнена не "влево", а "по центру".
Как это сделать?
Записан

Человеческая глупость дает представление о бесконечности
(с) Иоанна Хмелевская
Termit
Самовар
**
Offline Offline

Сообщений: 144



Просмотр профиля WWW
« Ответ #1 : Октябрь 28, 2011, 22:37 »

Нагуглил решение, но оно немного не то что я хотел

http://stackoverflow.com/questions/1707967/how-do-i-place-qtablewidgetitem-icon-in-center-of-cell

Описано там следующее решение

Код
C++ (Qt)
QStyleOptionViewItem MyTableWidget::viewOptions() const
{
   QStyleOptionViewItem option = QTableWidget::viewOptions();
   option.decorationAlignment = Qt::AlignHCenter | Qt::AlignCenter;
   option.decorationPosition = QStyleOptionViewItem::Top;
 
   return option;
}
 

Только иконку сделать центр по вертикали и центр по горизонтали не получается :-(
Центр по горизонтали - да, а вот по вертикали либо верх, либо низ...

Вопрос все ещё актуален.
Записан

Человеческая глупость дает представление о бесконечности
(с) Иоанна Хмелевская
andrew.k
Гость
« Ответ #2 : Октябрь 30, 2011, 00:56 »

Qt::TextAlignmentRole или QTableView alignment items
« Последнее редактирование: Октябрь 30, 2011, 00:58 от andrew.k » Записан
Termit
Самовар
**
Offline Offline

Сообщений: 144



Просмотр профиля WWW
« Ответ #3 : Октябрь 30, 2011, 13:42 »

Qt::TextAlignmentRole или QTableView alignment items

Qt::TextAlignmentRole - не дает никакого эффекта на  QDecorationRole

По поводу ссылки. Метод displayAlignment - "This variable holds the alignment of the display value for the item." Опять же QDecorationRole к value никакого отношения не имеет.
Записан

Человеческая глупость дает представление о бесконечности
(с) Иоанна Хмелевская
andrew.k
Гость
« Ответ #4 : Октябрь 30, 2011, 15:01 »

Qt::TextAlignmentRole или QTableView alignment items

Qt::TextAlignmentRole - не дает никакого эффекта на  QDecorationRole
Что эта чушь вообще значит?
Тебе в метод data() надо добавить обработку
Код
C++ (Qt)
if ( role == Qt::TextAlignmentRole )
{
  return Qt::AlignCenter | Qt::AlignVCenter;
}
 
По поводу ссылки. Метод displayAlignment - "This variable holds the alignment of the display value for the item." Опять же QDecorationRole к value никакого отношения не имеет.
Какой метод? там описано как сделать делегата, который осуществляет нужное выравнивание.
Записан
Termit
Самовар
**
Offline Offline

Сообщений: 144



Просмотр профиля WWW
« Ответ #5 : Октябрь 30, 2011, 15:20 »

Что эта чушь вообще значит?
Тебе в метод data() надо добавить обработку

"Эта чушь" обозначает, что роль Qt::TextAlignmentRole работает только с ТЕКСТОМ или если более точно, то TextAlignmentRole действует на роль Qt::DisplayRole
Я же спрашиваю за Qt::DecorationRole.
Записан

Человеческая глупость дает представление о бесконечности
(с) Иоанна Хмелевская
andrew.k
Гость
« Ответ #6 : Октябрь 31, 2011, 05:06 »

Ты так криво выражаешься, что я не врубился. "Роль действует на роль."
"Но я понял, ваш язык." (с) КВН.

Да следовало бы догадаться из названия TextAlignmentRole  Шокированный

По ссылке там тоже текст выравнивается. Я не уловил этот момент. Косяк.
Тогда других вариантов нет, кроме как писать своего делегата.
Записан
kolob
Частый гость
***
Offline Offline

Сообщений: 296



Просмотр профиля
« Ответ #7 : Июнь 10, 2013, 18:26 »

Определить свой делегат. Переопределить функцию paint() в нем. Что то типа того:
Код:
if (index.column() == 1)     //столбец где иконка нужна по центру
    {
        QRect rect(opt.rect);
        QVariant value = index.data(Qt::DecorationRole);
        QPixmap pixmap = decoration(opt, value);

        drawBackground(painter, opt, index);
        drawDecoration(painter, opt, rect, pixmap);
        return;
    }
Записан

Qt 5.11.0, Win, MinGW
Termit
Самовар
**
Offline Offline

Сообщений: 144



Просмотр профиля WWW
« Ответ #8 : Июнь 10, 2013, 19:01 »

Спасибо, но в конечном счете удовлетворил тот вариант, что был нагуглен.
Записан

Человеческая глупость дает представление о бесконечности
(с) Иоанна Хмелевская
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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