【问题标题】:How can I create a QTableWidgetItem right-justified with long text, with the ellipses on the left?如何创建一个 QTableWidgetItem 右对齐的长文本,左侧有省略号?
【发布时间】:2018-11-02 09:52:02
【问题描述】:

假设我有一个 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(),做一些类似的事情;或使用样式表;这样基础数据将是完整且正确的路径名,但要使其显示为真正的右对齐 - 即使该列对于基础文本来说太窄。

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

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

    经过一番搜索,看了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 的回答一样,但我喜欢它如何记录哪些列修改了代表,哪些没有这样。这样做,您不必为需要左省略文本的每个实例使用尽可能多的代码。快来看看吧。

    【讨论】:

      【解决方案2】:

      对于左侧的省略号,您可以在路径名上使用QFontMetrics,并在左侧使用Qt::ElideLeft 省略它。

      QTableWidgetItem *item = new QTableWidgetItem();
      // your metric
      QFontMetrics metrics(item->font());
      // your path
      QString pathname = "C:\\Directory1\\Directory2\\Directory3\\example.txt";
      // your elided path
      QString elidedPathname = metrics.elidedText(pathname, Qt::ElideLeft, item->sizeHint().width());
      // setting your new string in your item
      item->setText(elidedPathname);
      item->setTextAlignment(Qt::AlignVCenter | Qt::AlignRight);
      ui->myTable->setItem(row, 1, item);
      

      【讨论】:

      • 我担心当用户调整列宽时此解决方案不会更新省略号。
      猜你喜欢
      • 2012-06-19
      • 2012-04-05
      • 2013-07-31
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      • 1970-01-01
      • 2019-01-06
      • 1970-01-01
      相关资源
      最近更新 更多