Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Termit от Октябрь 28, 2011, 22:07



Название: Выравнивание DecorationRole
Отправлено: Termit от Октябрь 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");
   }
}
 

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


Название: Re: Выравнивание DecorationRole
Отправлено: Termit от Октябрь 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;
}
 

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

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


Название: Re: Выравнивание DecorationRole
Отправлено: andrew.k от Октябрь 30, 2011, 00:56
Qt::TextAlignmentRole или QTableView alignment items (http://www.qtcentre.org/archive/index.php/t-27154.html)


Название: Re: Выравнивание DecorationRole
Отправлено: Termit от Октябрь 30, 2011, 13:42
Qt::TextAlignmentRole или QTableView alignment items (http://www.qtcentre.org/archive/index.php/t-27154.html)

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

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


Название: Re: Выравнивание DecorationRole
Отправлено: andrew.k от Октябрь 30, 2011, 15:01
Qt::TextAlignmentRole или QTableView alignment items (http://www.qtcentre.org/archive/index.php/t-27154.html)

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 никакого отношения не имеет.
Какой метод? там описано как сделать делегата, который осуществляет нужное выравнивание.


Название: Re: Выравнивание DecorationRole
Отправлено: Termit от Октябрь 30, 2011, 15:20
Что эта чушь вообще значит?
Тебе в метод data() надо добавить обработку

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


Название: Re: Выравнивание DecorationRole
Отправлено: andrew.k от Октябрь 31, 2011, 05:06
Ты так криво выражаешься, что я не врубился. "Роль действует на роль."
"Но я понял, ваш язык." (с) КВН.

Да следовало бы догадаться из названия TextAlignmentRole  :o

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


Название: Re: Выравнивание DecorationRole
Отправлено: kolob от Июнь 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;
    }


Название: Re: Выравнивание DecorationRole
Отправлено: Termit от Июнь 10, 2013, 19:01
Спасибо, но в конечном счете удовлетворил тот вариант, что был нагуглен.