Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Alexey_Golubev_92 от Май 23, 2020, 20:00



Название: Как можно изменять размеры столбцов qtableView с использованием Delegate?
Отправлено: Alexey_Golubev_92 от Май 23, 2020, 20:00
Цель сделать автоматический перенос текста при фиксированных размерах столбцов. Начал делать и столкнулся с первой проблемой.
1.Размеры столбцов должны равняться размеру выводимой информации. А так получается что "дата время" не вписывается в столбец "Дата", а вылазят за пределы.
Что сделал:
Код:
    ui->tableView->setModel(model);
    ui->tableView->setItemDelegate(new TableViewColumnDelegate(this));
    ui->tableView->setWordWrap(true);
    ui->tableView->setTextElideMode(Qt::ElideNone);
    ui->tableView->setFont(font);

    [b]//ui->tableView->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents); // думал этого хватит, но оказалось нет
    ui->tableView->resizeColumnToContents(0);
    ui->tableView->resizeColumnToContents(1);
    ui->tableView->horizontalHeader()->setResizeMode(0, QHeaderView::Fixed);
    ui->tableView->horizontalHeader()->setResizeMode(1, QHeaderView::Fixed);
    ui->tableView->horizontalHeader()->setResizeMode(2, QHeaderView::Stretch);[/b]
Добавил делегейт "QStyledItemDelegate":
Код:
void TableViewColumnDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    if(!index.isValid())
           return;
       painter->save();

       if (option.state & QStyle::State_Selected){
           painter->fillRect(option.rect, option.palette.highlight());
       }

       QString Text = index.data().toString();
       qDebug() << "Text" << Text;

       QFont Font = QApplication::font();
       QFontMetrics Fm(Font);
       QRect Rect = Fm.boundingRect(option.rect.left(), option.rect.top() ,
                                     option.rect.width(),  option.rect.height(),
                                     Qt::AlignLeft|Qt::AlignTop|Qt::TextWordWrap,
                                     Text);
       painter->setPen(Qt::black);
       painter->setFont(Font);
       painter->drawText(Rect, Qt::AlignLeft|Qt::AlignTop|Qt::TextWordWrap, Text);
       painter->restore();
}

QSize TableViewColumnDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    if(!index.isValid())
        return QSize();
    QString Text = index.data().toString();
    QFont Font = QApplication::font();
    QFontMetrics Fm(Font);
    QRect Rect = Fm.boundingRect(0, 0, option.rect.width(), 0,
                                             Qt::AlignLeft|Qt::AlignTop|Qt::TextWordWrap,
                                             Text);
    QSize size(option.rect.width(), Rect.height());
    return size;
}
Получил: