假设我有一个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()来做类似的事情;或使用样式表;这样,基础数据将是完整且正确的路径名,但即使它的列对于基础文本而言太窄,它也可以显示为真正的右对齐。
答案 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的答案中一样,但是我喜欢它如何记录哪些列已修改了委托而哪些没有这种方式。天哪。