首页 > 解决方案 > 如何创建一个 QTableWidgetItem 右对齐的长文本,左侧有省略号?

问题描述

假设我有一个 QTableWidget。然后,我为它创建项目

QString pathname="C:\\Directory1\\Directory2\\Directory3\\example.txt";
QTableWidgetItem*item=new QTableWidgetItem(pathname);
item->setTextAlignment(Qt::AlignVCenter | Qt::AlignRight);
ui->myTable->setItem(row, 1, item);

如果列比路径名更窄,那么我会得到类似:

“C:\Directory1\Dir ...”

但是,列显示会更有用,恕我直言,如果它真的是右对齐的,因为路径名的末尾部分将与单元格的右侧部分对齐,而不适合的部分,因为单元格太窄,在左侧用省略号(即“...”)表示,例如

“... ectory3\example.txt”

这样,如果同一目录中有很多文件,则显示的文本可能会显示完整的文件名,前提是它不会太长;而不是显示大量条目,只显示路径的左侧部分,结果它们都显示相同。

我意识到我可以通过调用来了解在当前字体、间距、重量等下将显示多大的文本字符串。然后,我可能会迭代,直到找到适合的最大字母;并在上面的代码中将其设置为适合的数量。

但是,我宁愿使用 QStyledItemDelegate 并使用 setItemDelegateForColumn(),做一些类似的事情;或使用样式表;这样基础数据将是完整且正确的路径名,但要使其显示为真正的右对齐 - 即使该列对于基础文本来说太窄也是如此。

标签: c++qt

解决方案


好的,我找到了一个更简单的解决方案。只有一种方法可以覆盖;而且我不必为每个项目都这样做。谢谢你的帮助,寿。

经过一番搜索,阅读了 qitemdelegate.cpp 的代码,我知道有一个 QStyledItemDelegate 的 setOptions 方法。我只是无法弄清楚它正在使用的选项可能是如何设置或使用的(以对此有用的方式?)。然后,我尝试了不同的搜索,结果发现:

QTreeView 、QStandardItemModel 的省略模式

wysota 的回复原来是一个很好的答案(尽管我不喜欢他的同质化座右铭——你会认为他为 M$ 工作)。从那以后,我想出了:

class elideLeftItemC : public QStyledItemDelegate
{
    virtual void paint(QPainter *painter, const QStyleOptionViewItem &option,
      const QModelIndex &index) const
    {
        QStyleOptionViewItem opt = option;
        opt.textElideMode=Qt::ElideLeft;
        QStyledItemDelegate::paint(painter, opt, index);
    }
} elideLeftItem;

然后,我可以在任何需要省略的左侧文本时重用任何合适的数据类型,例如:

ui->twMyTable->setItemDelegateForColumn(0, &elideLeftItem);

可能有一种方法可以将其分配到更远的上游,但这还不错。我可能还测试了列号,就像 wysota 的回答一样,但我喜欢它如何记录哪些列修改了代表,哪些没有这样。这样做,您不必为需要左省略文本的每个实例使用尽可能多的代码。就这样吧。


推荐阅读