Изменить данные QHeaderView

Я пытаюсь изменить текст моего QHeaderView (Horizontal) в моем QTableWidget.

Первый вопрос: возможно ли установить его редактируемым, как QTableWidgetItem?

Второй вопрос: если это невозможно, как я могу это сделать, я попытался перекрасить это так:

void EditableHeaderView::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const
{
painter->save();
QHeaderView::paintSection(painter, rect, logicalIndex);
painter->restore();

painter->setPen(Qt::SolidLine);
painter->drawText(rect, Qt::AlignCenter, m_sValues[logicalIndex]);
}

Но индекс заголовка нарисован позади моего текста.


Другое решение, которое я попробовал:

void EditableHeaderView::mySectionDoubleClicked( int section )
{
if (section != -1) // Not on a section
m_sValues[section] = QInputDialog::getText(this, tr("Enter a value"), tr("Enter a value"), QLineEdit::Normal, "");

QAbstractItemModel* model = this->model();
model->setHeaderData(section, this->orientation(), m_sValues[section]);
this->setModel(model);
}

Но это не работает …

Я надеюсь, что у кого-то есть решение.

Спасибо !

0

Решение

Это может быть сделано без подклассов, также вам не нужно рисовать свой раздел, чтобы установить текст, сделайте это с setHeaderData, Например, следующий код работает без ошибок.

//somewhere in constructor for example
connect(ui->tableWidget->horizontalHeader(),&QHeaderView::sectionDoubleClicked,[=]( int logicalIndex) {//with lambda
qDebug() << "works";
QString txt =  QInputDialog::getText(this, tr("Enter a value"), tr("Enter a value"), QLineEdit::Normal, "");
ui->tableWidget->model()->setHeaderData(logicalIndex,Qt::Horizontal,txt);
});

До:

введите описание изображения здесь

После:

введите описание изображения здесь

Я использовал здесь C++11 (CONFIG += c++11 в .pro файл) и новый синтаксис сигналов и слотов, но, конечно, вы можете использовать старый синтаксис, если хотите.

3

Другие решения

Я не знаю, почему ваше решение не работает, но я нашел очень простой обходной путь:

QString res =  QInputDialog::getText(this, tr("Enter a value"), tr("Enter a value"), QLineEdit::Normal, "");
setHorizontalHeaderItem(logicalIndex, new QTableWidgetItem(res));

Спасибо за помощь !

2

По вопросам рекламы [email protected]