假设我有一个 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 ...”
但是,恕我直言,列显示会更有用,如果它真的是右对齐的,因为路径名的末尾部分要与单元格的右侧部分对齐,而没有对齐的部分' t fit,因为单元格太窄,在左边用省略号(即“...”)表示,例如
“... ectory3\example.txt”
这样,如果同一目录中有很多文件,显示的文本可能会显示完整的文件名,前提是它不太长;而不是只显示路径的左侧部分来显示大量条目,结果它们都显示相同。
我意识到我可以调用以了解在当前字体、间距、粗细等条件下文本字符串将显示多大。然后,我可能会迭代直到找到适合的最大字母;并在上面的代码中将其设置为尽可能多。
但是,我宁愿使用 QStyledItemDelegate 并使用 setItemDelegateForColumn(),做类似的事情;或使用样式表;这样基础数据将是完整且正确的路径名,但要显示它是真正右对齐的 - 即使列对于基础文本来说太窄了。
最佳答案
好的,我找到了一个更简单的解决方案。只有一种方法可以覆盖;而且我不必为每个项目都这样做。感谢您的帮助。
经过一番搜索,阅读了qitemdelegate.cpp的代码,我知道QStyledItemDelegate有一个setOptions方法。我只是无法弄清楚它使用的选项是如何设置或使用的(以对此有用的方式?)。然后,我尝试了不同的搜索,发现了:
Elide modes for 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 的回答一样,但我喜欢它如何记录哪些列已经修改了代表,哪些列没有这样。通过这种方式,您不必为每个需要左省略文本的实例使用尽可能多的代码。别这样。
关于c++ - 如何创建 QTableWidgetItem 右对齐的长文本,左侧有省略号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53116232/