【问题标题】:QTableView with multiline cell带有多行单元格的 QTableView
【发布时间】:2013-05-10 11:45:46
【问题描述】:

如何创建 QTableView 多行单元格?

我正在使用下面的代码填写表格。 但是Whem GetDescription()返回一个长字符串,内容以...结束

有什么办法可以自动换行吗?

QStandardItemModel * model = new QStandardItemModel(logos.size(), 2, this);
model->setHorizontalHeaderItem(0, new QStandardItem(QString("")));
model->setHorizontalHeaderItem(1, new QStandardItem(QString("Nome")));
model->setHorizontalHeaderItem(2, new QStandardItem(QString("Descrição")));

int row = 0;
foreach(Item * item, items)
{
    QStandardItem* check = new QStandardItem(true);
    check->setCheckable(true);
    model->setItem(row, 0, check);

    QStandardItem *nameItem = new QStandardItem(QString(item->GetName()));
    nameItem->setEditable(false);
    model->setItem(row, 1, nameItem);

    QStandardItem *descriptionItem = new QStandardItem(item->GetDescription());
    descriptionItem->setEditable(false);
    descriptionItem->setToolTip(logo->GetDescription());
    model->setItem(row, 2, descriptionItem);
    row++;
}

ui->tableView->setModel(model);
ui->tableView->resizeColumnToContents(0);
ui->tableView->resizeColumnToContents(1);
ui->tableView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
ui->tableView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Fixed);
ui->tableView->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch);
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);

【问题讨论】:

    标签: c++ qt desktop-application qt5 qtableview


    【解决方案1】:

    我认为自动换行是您正在寻找的。确保你有 enabled wordwrap 用于 QTableView,然后是 manually resize the rows to fit their contents。这将用文本替换椭圆。

    正如您在回答中提到的,您可以将set the QHeaderView to resize 转为内容automatically,但如果您进行大量添加和删除操作,这会减慢速度。我更喜欢通过大的加法/减法手动调整大小,特别是因为用户可能会觉得无法自己调整大小很烦人。

    这是一些启用自动换行的示例代码,将椭圆设置为出现在中间(我的偏好),然后手动调整行高以适应单词边界处的内容:

    ui->tableView->setWordWrap(true);
    ui->tableView->setTextElideMode(Qt::ElideMiddle);
    ui->tableView->resizeRowsToContents();
    

    【讨论】:

    • 你也可以考虑改变QTableView的elide mode
    【解决方案2】:

    我只添加到我的代码中:

    ui->tableView->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
    

    【讨论】:

      【解决方案3】:

      据我所知,在单元格中实现多行文本绘制的唯一方法是实现自己的委托。

      您可以派生自QItemDelegate

      你必须这样做

      • 实现自己的sizeHint函数,基于QFontMetrics
      • 并覆盖 drawDisplay 函数以实际显示文本。您可以使用QPainter::drawText 显示多行文本。因此,您不必关心绘制焦点和选择矩形,自己的绘制功能会很简单。

      【讨论】:

      • 我如何继承QItemDelegate?如何在QTableView 中设置新类?
      • “我如何继承 QItemDelegate”是什么意思?只是子类。您可以使用QAbstractItemView::setItemDelegate 函数设置您的委托。
      • 这是唯一的方法吗?您可以通过 QTableView 启用自动换行。
      【解决方案4】:
      tableView->resizeRowsToContents();
      

      【讨论】:

      • 就目前而言,您的回答相当短。您能否扩展它以阐明它与其他答案的不同之处以及它的优势是什么?
      • 如果能解决您的问题,优点是简单。注释这仅在调用时调整高度行的大小。如果用户调整表格大小,行宽也会调整,但高度保持不变。如果文本没有输入新的行大小,会出现...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 2017-09-28
      • 2012-01-18
      • 2022-01-03
      • 1970-01-01
      相关资源
      最近更新 更多