我尝试在QTableWidget中修改QHeaderView(水平)的文本。
第一个问题:是否可以将其设置为像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 :(得分:3)
可以在没有子类化的情况下完成,也不需要绘制您的部分来设置文本,使用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
文件)和new syntax of signals and slots,但当然如果需要,您可以使用旧语法。
答案 1 :(得分:2)
我不知道为什么你的解决方案不起作用,但我找到了一个非常简单的解决方法:
QString res = QInputDialog::getText(this, tr("Enter a value"), tr("Enter a value"), QLineEdit::Normal, "");
setHorizontalHeaderItem(logicalIndex, new QTableWidgetItem(res));
感谢您的帮助!