Изменить данные 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);
}

But that doesn't works...

I hope someone have a solution.

Спасибо!

2 ответа

Это может быть сделано без подклассов, также вам не нужно рисовать свой раздел, чтобы установить текст, сделайте это с 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 файл) и новый синтаксис сигналов и слотов, но, конечно, вы можете использовать старый синтаксис, если хотите.

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

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

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

Другие вопросы по тегам