更改 QHeaderView 数据

Posted

技术标签:

【中文标题】更改 QHeaderView 数据【英文标题】:Change QHeaderView data 【发布时间】:2014-11-03 17:31:06 【问题描述】:

我尝试在我的 QTableWidget 中修改我的 QHeaderView (Horizo​​ntal) 的文本。

第一个问题:是否可以像 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);

但这不起作用......

希望有人能解决。

谢谢!

【问题讨论】:

【参考方案1】:

它可以在没有子类化的情况下完成,您也不需要绘制您的部分来设置文本,请使用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++11CONFIG += c++11.pro 文件)和new syntax of signals and slots,当然你可以根据需要使用旧语法。

【讨论】:

感谢您的回答! qDebug() 有效,但我的标题文本保持不变,我已复制粘贴您的代码,但我不明白为什么它不起作用:'(【参考方案2】:

我不知道为什么您的解决方案不起作用,但我找到了一个非常简单的解决方法:

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

感谢您的帮助!

【讨论】:

很高兴您找到并分享了答案,为您+1。我之前没有在我的回答中使用它,因为这不适用于 QTableView,我想要更通用,但这个解决方案适合你是件好事。祝你好运:)

以上是关于更改 QHeaderView 数据的主要内容,如果未能解决你的问题,请参考以下文章

在 QHeaderView 和 QListWidget 之间拖放列

自定义QHeaderView后,点击表头排序失效的解决办法

PyQt4 代码在 PyQt5 (QHeaderView) 上不起作用

QTableWidget 和 QHeaderView CSS

右键单击 QTreeView 内的 QHeaderView

Qt C++ 在表之间拖动 QHeaderView