LINUX.ORG.RU

Перенос текста в ячейке в qtableView?

 ,


0

1

Как сделать перенос текста в ячейке, если не влезает в ширину столбца с помощью в qtableView?

Ни как не могу сделать перенос. Уже использую Delegate, но не получилось. Что сделал:

model = new QSqlTableModel(this,db);
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->setTable("TableEventBalancer");
model->select();
TableViewColumnDelegate *tableviewcolumnDelegate;
tableviewcolumnDelegate = new TableViewColumnDelegate;
ui->tableView->setItemDelegate(tableviewcolumnDelegate);
ui->tableView->setModel(model);
ui->tableView->setWordWrap(true);
ui->tableView->setTextElideMode(Qt::ElideNone);
int id = QFontDatabase::addApplicationFont("/usr/share/fonts/dejavu/DejaVuSansMono.ttf");
QFont font = QFont(QFontDatabase::applicationFontFamilies(id).first());
font.setPointSize(12);
ui->tableView->setFont(font);
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);
ui->tableView->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents);
model->setHeaderData(model->fieldIndex("number"), Qt::Horizontal, QString::fromLocal8Bit("ID"));
model->setHeaderData(model->fieldIndex("_date"), Qt::Horizontal, QString::fromLocal8Bit("Дата"));
model->setHeaderData(model->fieldIndex("text"), Qt::Horizontal, QString::fromLocal8Bit("Событие"));

Делегейт:

#include <QStyledItemDelegate>
#include <QPainter>
#include <QApplication>
#include <QDebug>
 
class TableViewColumnDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    explicit TableViewColumnDelegate(QObject *parent = 0);
    void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const;
    QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
    QSize iconSize;
    int padding;
 
signals:
 
public slots:
};
 
#include "tableviewcolumndelegate.h"
 
TableViewColumnDelegate::TableViewColumnDelegate(QObject *parent) : QStyledItemDelegate(parent)
{
    iconSize = QSize(100, 40);
    padding = 5;
}
 
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(0).toString();
       qDebug() << "Text" << Text;
 
       QString Text1 = index.data().toString();
       qDebug() <<"Text1"<< Text1;
 
       QFont Font = QApplication::font();
       QFontMetrics Fm(Font);
       QRect Rect = Fm.boundingRect(option.rect.left() + iconSize.width(), option.rect.top() + padding,
                                     option.rect.width() - iconSize.width(), 0,
                                     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() - iconSize.width(), 0,
                                             Qt::AlignLeft|Qt::AlignTop|Qt::TextWordWrap,
                                             Text);
    QSize size(option.rect.width(), Rect.height() +  3*padding);
 
    if(size.height()<iconSize.height())
        size.setHeight(iconSize.height());
    return size;
}

Получил, что время не вписалось в столбец и перенос не заработал.



Последнее исправление: Alex_Golubev (всего исправлений: 2)

Как сделать перенос текста в ячейке, если не влезает в ширину столбца с помощью в qtableView?

Поставить wordWrap флаг в .ui файле?

dramcryx
()
Ответ на: комментарий от RazrFalcon

Как понял Word-wrap не может сам изменять размер ячейки. Как следствие не делает перенос. Нужно переопределять метод sizeHint. Сделал вот так, но результат переноса не получил. [code]

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; }

[/code]

Alex_Golubev
() автор топика
Последнее исправление: Alex_Golubev (всего исправлений: 1)
Ответ на: комментарий от Alex_Golubev

Как понял Word-wrap не может сам изменять размер ячейки.

И не должен. Может вам нужен resizeColumnsToContents()/resizeRowsToContents()?

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

Применял resizeColumnsToContents()/resizeRowsToContents(). Не помогало.

Alex_Golubev
() автор топика
Ответ на: комментарий от RazrFalcon

Я же правильно понимаю что нужно вызывать resizeRowsToContents() в событии resizeEvent(QResizeEvent *event) для переноса строки?

Alex_Golubev
() автор топика
Ответ на: комментарий от RazrFalcon

Честно слово. Как сделать этот перенос текста? Нет ни где информации. Хоть какой рабочий пример.

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