Я хочу установить собственный QHeaderView для поворота текста горизонтального заголовка. Я работаю с QStandarItemModel
На данный момент у меня есть это
class QHeaderViewR : public QHeaderView
{
public:
QHeaderViewR():QHeaderView(Qt::Horizontal)
{}
void paintSection(QPainter * painter, const QRect & rect, int logicalIndex) const
{
QPen pen(Qt::black);
painter->setPen(pen);
painter->translate(rect.width() * logicalIndex, (logicalIndex * -18) -18);
painter->rotate(90);
painter->drawText(rect,"header");
}
};
Я не очень понимаю, что я сделал с переводчиком. Я просто пошел методом проб и ошибок, пока он не совпал с колонками. Тем не менее, это не так идеально, и это сокращает текст без видимой причины. Что я должен сделать, чтобы текст соответствовал столбцам и не был обрезан?
«картинка несоответствия и вырезанного текста»
Другое дело, что я не хочу просто писать «заголовок» в каждом столбце. Модель, которую нужно просмотреть, имеет HorizontalHeaderItem, назначенный для каждого столбца, и я хотел бы показать эти заголовки вместо
Заранее спасибо за помощь
Я решил это. Просто добавил QStringList в качестве параметра конструктора и перебрал его, используя логический индекс. Это конечный результат
class QHeaderViewR : public QHeaderView
{
QStringList heads;
public:
QHeaderViewR(QStringList _heads):QHeaderView(Qt::Horizontal)
{
heads = _heads;
}
void paintSection(QPainter * painter, const QRect & rect, int logicalIndex) const
{QPen pen(Qt::black);
painter->setPen(pen);
painter->rotate(90);
painter->translate(0,-rect.width()+1);
QRect copy = rect;
copy.setWidth(rect.height());
copy.setHeight(rect.width());
copy.moveTo(0,-this->sectionPosition(logicalIndex));
if (logicalIndex == 0)
{
copy.setHeight(rect.width()-1);
}
painter->drawText(copy, " " + heads.at(logicalIndex));
painter->drawRect(copy);
}
};
Поскольку QHeaderView является только представлением, вы должны получить данные для отображения из модели.
Итак, похоже на базовая реализация в QHeaderView:
QString text = model()->headerData(logicalIndex, orientation(), Qt::DisplayRole).toString();
Чтобы установить заголовки на модели, используйте, например,
QStandardItemModel::setHorizontalHeaderLabels(const QStringList &labels)