LINUX.ORG.RU

QItemDelegate sizeHint для режима редактирования


0

1

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

Делаю делегат для таблицы. Получилось весьма костыльно, но даже так не получилось...

sizeHint при появлении и при закрытии редактора не вызывается. Вызывается, если изменить размеры окна программы(таблицы).

Добавил сигнал layoutChanged, но соединение его с layoutChanged модели ничего не дает. Есть идеи куда его можно присоеденить?

Как вообще правильно реализовывать itemdelegate для этой задачи?

Есть вообще шаряшие в qt и model/view programming люди?

#include <QApplication>

#include <QTableView>
#include <QHeaderView>
#include <QStyledItemDelegate>
#include <QComboBox>
#include <QMap>
#include <QStandardItemModel>

class ItemDelegate : public QStyledItemDelegate
{
    Q_OBJECT
  public:
    explicit ItemDelegate(QObject* parent = 0) : QStyledItemDelegate(parent)
    {}

    QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& /*option*/, const QModelIndex& index) const
    {
      QComboBox* editor = new QComboBox(parent);
      editor->setSizeAdjustPolicy(QComboBox::AdjustToContents);
      editor->addItems(QStringList() << "QComboBox item 11111111111"  << "QComboBox item 2");

      m_sizeHint[index] = editor->sizeHint();
      m_isEditing[index] = true;

      emit layoutChanged();

      return editor;
    }

    void setModelData(QWidget* /*editor*/, QAbstractItemModel* /*model*/, const QModelIndex& index) const
    {
      m_isEditing[index] = false;

      emit layoutChanged();
    }

    virtual QSize sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index) const
    {
      return m_isEditing[index] ? m_sizeHint[index] : QStyledItemDelegate::sizeHint(option, index);
    }

  signals:
    void layoutChanged() const;

  private:
    mutable QMap<QModelIndex, QSize> m_sizeHint;
    mutable QMap<QModelIndex, bool> m_isEditing;
};

int main(int argc, char *argv[])
{
  QApplication a(argc, argv);

  ItemDelegate* delegate = new ItemDelegate;
  QStandardItemModel model(2, 2);
  model.setData(model.index(0, 0), "1");
  model.setData(model.index(0, 1), "2");
  model.setData(model.index(1, 0), "3");
  model.setData(model.index(1, 1), "4");

  // модели пофиг
  QObject::connect(delegate, SIGNAL(layoutChanged()), &model, SIGNAL(layoutChanged()));

  QTableView* table = new QTableView;
  table->resize(600, 400);

  table->setModel(&model);
  table->setItemDelegate(delegate);

  table->horizontalHeader()->setResizeMode(0, QHeaderView::ResizeToContents);
  table->horizontalHeader()->setResizeMode(1, QHeaderView::Stretch);

  table->show();

  return a.exec();
}

#include "main.moc"


Не знаю, как правильно, но можно попробовать мануально выставлять ширину столбца вьюхи по запросу делегата.

unC0Rr ★★★★★ ()

Есть шикарная книга про Qt4, постучись на почту - скину. Там есть и про модели с представлениями. я по ней учился работать с моделями.

MikeDM ★★★★★ ()
Ответ на: комментарий от unC0Rr

костыльно выглядит) это самый запасной вариант, если не удастся выяснить как же сделать красиво

зачем вообще тогда нужен sizehint делегату, если он тупо не работает как нужно? неужели qt такая непродуманная библиотека?

или я первый человек во вселенной столкнувшийся с такой задачей?

Ower ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.