如何创建长文本右对齐且左侧为椭圆的QTableWidgetItem?

时间:2018-11-02 09:52:02

标签: 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);

如果该列比路径名更狭窄,那么我会得到类似的东西:

“ C:\ Directory1 \ Dir ...”

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

“ ... ectory3 \ example.txt”

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

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

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

3 个答案:

答案 0 :(得分:0)

对于左侧的省略号,可以在路径名上使用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);

答案 1 :(得分:0)

1。您实现了QStyledItemDelegate

2。并且您覆盖了其方法updateEditorGeometry。 您可以通过QFontMetrics(您喜欢的文本的QFont和boundingRect'大小)设置几何图形的宽度。(如果要在“正确位置”上强力强调,请为该大小加上适当的宽度。)

3。最后,将QtCore.Qt.TextAlignmentRole设置为QTableWidgetItem的数据。

该值自然为QtCore.Qt.AlignRight

QTableWidgetItem将反映角色的作用。

我要添加解决方案。

您制作

headerViewItem = QtGui.QTableWidgetItem("column name")
headerViewItem.setSizeHint(QtCore.QSize(width,height))
tablewidget.setHorizontalHeaderItem(column)
tablewidget.resizeColumnToContents(column)

如果这样做,则可以在不执行任何操作时完全查看tableItem并调用委托。自然,宽度必须由QFontMetrics的boundingRect计算。

至少,您可以解决“ ...”问题。

答案 2 :(得分:0)

好的,我找到了一个更简单的解决方案。只是一种替代方法;而且我不必为每个项目都做。谢谢您的帮助。

经过一些搜索,并阅读了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的答案中一样,但是我喜欢它如何记录哪些列已修改了委托而哪些没有这种方式。天哪。

相关问题