Russian Qt Forum

Qt => Model-View (MV) => Тема начата: kpx13 от Март 31, 2011, 01:12



Название: [РЕШЕНО] QTableView с QDoubleSpinBox'ами. Как изменить их свойства?
Отправлено: kpx13 от Март 31, 2011, 01:12
Здравствуйте!
У меня есть табличка QTableView из double'ов, в каждой ячейке QDoubleSpinBox по сути.
Только вот проблема в том, что свойства спинбоксов дефолтные, т.е. шаг = 1.0 и точность - 2 знака.
Мне нужно изменять эти настройки в зависимости от содержимого.
К примеру, если в ячейке число 0.005, и мы хотим отредактировать это значение, то надо для этой ячейки сделать setDecimals (4).
Или хотя бы расскажите как сделать чтобы точность для всей таблицы изменить (2 знака - не серьёзно).


Название: Re: QTableView с QDoubleSpinBox'ами. Как изменить их свойства?
Отправлено: GreatSnake от Март 31, 2011, 08:25
Заводишь свой делегат, в котором перегружаешь createEditor(), в котором создаешь QDoubleSpinBox с нужными тебе свойствами.


Название: Re: [РЕШЕНО] QTableView с QDoubleSpinBox'ами. Как изменить их свойства?
Отправлено: kpx13 от Март 31, 2011, 17:24
Я сделала!
Кому интересно, вот код:

Код:
class props_table_delegate : public QItemDelegate
{
public:
  props_table_delegate (QObject *view) : QItemDelegate (view)
    {
    }

  QWidget * createEditor (QWidget *parent, const QStyleOptionViewItem &/*option*/, const QModelIndex &index) const
    {
      QDoubleSpinBox *sb = 0;
      QString str;
      double value;
      bool ok;

      str = index.data (Qt::DisplayRole).toString ();
      value = index.data (Qt::DisplayRole).toDouble (&ok);

      if (!ok)
        return parent;
      sb = new QDoubleSpinBox (parent);
      sb->setDecimals (precision_of_double_from_string (str));
      sb->setSingleStep (1.0 / 20.0);
      return (QWidget *) sb;
    }
};


Название: Re: [РЕШЕНО] QTableView с QDoubleSpinBox'ами. Как изменить их свойства?
Отправлено: twp от Март 31, 2011, 18:08
имхо лучше дать создать редактор стандатному итему, а потом уже установить нужные свойства, например так:
Код:
  QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
  {
         QWidget *w = QItemDelegate::createEditor(parent, option, index);

         if (QDoubleSpinBox *sb = qobject_cast<QDoubleSpinBox *>(w)) {
             sb->setDecimals (...);
             sb->setSingleStep (...);
         }
         return w;
  }