Нужно запихнуть в таблицу комбо боксы, которые появляются при редактировании ячейки. Нужно, чтобы ширина столбцов автоматически подстраивалась под размер данных для каждого режима.
Делаю делегат для таблицы. Получилось весьма костыльно, но даже так не получилось...
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"