c++ - 如何创建一个 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(),做一些类似的事情;或使用样式表;这样基础数据将是完整且正确的路径名,但要使其显示为真正的右对齐 - 即使该列对于基础文本来说太窄也是如此。
解决方案
好的,我找到了一个更简单的解决方案。只有一种方法可以覆盖;而且我不必为每个项目都这样做。谢谢你的帮助,寿。
经过一番搜索,阅读了 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 的回答一样,但我喜欢它如何记录哪些列修改了代表,哪些没有这样。这样做,您不必为需要左省略文本的每个实例使用尽可能多的代码。就这样吧。
推荐阅读
- java - Apache commons csv解析尝试读取集合大小后面的下一条记录
- php - 是否有一个 SQL 查询可以用来满足一组相当复杂的条件?
- python - 点击装饰器可以在非主要功能上很好地工作吗?
- opencpu - 当我使用 wait=FALSE 调用 system() 时进程终止
- python - 似乎无法让我的程序停止抛出无效语法
- angular - 不使用成功/失败块的角度嵌套 HTTP 调用
- java - 在java中动态选择要更新的字段
- .net-core - 在 automapper 中添加服务(注入)
- python - Pandas TypeError: aggregate() 至少需要 2 个参数(1 个给定)
- html - 下拉引导移动我的导航栏的所有项目