如何创建一个 QTableWidgetItem 右对齐长文本,省略号在左边?

Cod*_*ker 5 c++ qt

假设我有一个 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);
Run Code Online (Sandbox Code Playgroud)

如果该列比路径名更窄,那么我会得到类似以下内容的信息:

“C:\Directory1\Dir ...”

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

“...ectory3\example.txt”

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

我意识到我可以进行调用来找出以当前字体、间距、粗细等显示的文本字符串有多大。然后,我可能会迭代,直到找到适合的最大字母;并在上面的代码中将其设置为适合的大小。

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

Cod*_*ker 5

好吧,伙计们,我找到了一个更简单的解决方案。只需要覆盖一种方法;我不必为每个项目都这样做。谢谢你的帮助,呵呵。

经过一番搜索,阅读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;
Run Code Online (Sandbox Code Playgroud)

然后,每当我需要省略左侧文本时,我都可以将它与任何合适的数据类型一起使用,例如:

ui->twMyTable->setItemDelegateForColumn(0, &elideLeftItem);
Run Code Online (Sandbox Code Playgroud)

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

编辑:

我已将代码更新到 Qt5,并注意到它不再正常工作。我做了一些搜索,发现在文本中有反斜杠的情况下它会中断。它显然会破坏其他功能,但这是他们(几乎总是)做出默认破坏向后兼容性的糟糕选择的另一个 Qt 功能。答案在下面的SO问题中给出:“ QTableView的奇怪行为与包含斜线的文本”。你只需关闭这个新行为:

 ui->twMyTable->setWordWrap(false);
Run Code Online (Sandbox Code Playgroud)