День добрый!
Программа тянет данные из БД, для отображение использую QSqlRelationalTableModel и свой класс наследник от QTableView. Для отображение данных по внешним ключам решил сделать делегат, который будет показывать QTableView связной таблицы (алгоритм отображении связной таблице точно такой же).
Создаю делегат:
class DelegatPerson : public QItemDelegate
{
Q_OBJECT
public:
DelegatPerson (int id, QObject *parent = 0);
QWidget *createEditor(QWidget *parent,
const QStyleOptionViewItem &option, const QModelIndex &index) const;
void setEditorData (QWidget *editor, const QModelIndex &index) const;
void setModelData (QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
void updateEditorGeometry (QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &index) const;
virtual void paint (QPainter *painter,
const QStyleOptionViewItem& option, const QModelIndex& index ) const;
private:
CCatalogPerson catPerson; //это класс таблицы БД, данные которой и надо отображать
};
теперь в классе отображения первой таблицы делают так:
ViewUser::ViewUser (QWidget *parent)
: QTableView (parent)
{
DelegatPerson *delPerson = new DelegatPerson (0, this);
setItemDelegateForColumn(3, delPerson);
}
Если убрать
DelegatPerson *delPerson = new DelegatPerson (0, this);
то данные отображаются нормально иначе все ячейки пустое, но при этом делегат свои данные выдает.
Реализация делегата:
DelegatPerson::DelegatPerson (int id, QObject *parent)
: QItemDelegate (parent)
{
//TODO: в дальнейшем нужно реализовать чтобы
//в форме справочника текущим был элемент с id
}
QWidget *DelegatPerson::createEditor(QWidget *parent,
const QStyleOptionViewItem &option, const QModelIndex &index) const
{
//Редактором по идее должна быть форма списка справочника т.е. класс ViewPerson
ViewPerson *editor = new ViewPerson (parent);
//здесь уже остальные действия...
editor->setModel(catPerson.getModel());
editor->installEventFilter(const_cast<DelegatPerson*> (this));
return editor;
}
void DelegatPerson::setEditorData(QWidget *editor, const QModelIndex &index) const
{
}
void DelegatPerson::setModelData(QWidget *editor,
QAbstractItemModel *model, const QModelIndex &index) const
{
}
void DelegatPerson::updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &index) const
{
}
void DelegatPerson::paint (
QPainter *painter,
const QStyleOptionViewItem& option,
const QModelIndex& index ) const {
QString text;
QRect rect;
QVariant value;
QStyleOptionViewItemV2 opt = setOptions(index, option);
value = index.data(Qt::DisplayRole);
text = QLocale().toString(value.toDouble(), 'f', 2);
opt.displayAlignment = Qt::AlignRight | Qt::AlignVCenter;
drawDisplay(painter, opt, opt.rect, text);
//QPen pen = QPen(Qt::red, 2, Qt::DashLine,
// Qt::FlatCap, Qt::MiterJoin);
//painter->setPen(pen);
//painter->drawLine(opt.rect.left(), opt.rect.bottom(),
// opt.rect.right(), opt.rect.bottom());
//painter->drawLine(opt.rect.right(), opt.rect.top(),
// opt.rect.right(), opt.rect.bottom());
}
Думаю может из-за этого что не сделал реализацию setEditorData, setModelData и updateEditorGeometry.
Но если в конструкторе не устанавливать setItemDelegateForColumn(3, delPerson);, а даже просто оставить создание делегата - данные уже не отображаются.
Собственно вопрос - почему только инициализация экземпляра класса DelegatPerson в конструкторе ViewUser приводит к тому что данные не отображаются, хотя количество строк создается верное.