QComboBox在所选项目上省略了文本

时间:2016-12-28 11:00:14

标签: qt5 ellipsis qcombobox

所以,我有一个 QComboBox

enter image description here

如果 currentText()对于小部件太长,那么我想显示省略号。

像这样:

enter image description here

所以:

void MyComboBox::paintEvent(QPaintEvent * )
{
      QStylePainter painter(this);
      QStyleOptionComboBox opt;
      initStyleOption(&opt);
      painter.drawComplexControl(QStyle::CC_ComboBox, opt);

      QRect rect = this->rect();
      //this is not ideal
      rect.setLeft(rect.left() + 7);
      rect.setRight(rect.width() - 15);
      //

      QTextOption option;
      option.setAlignment(Qt::AlignVCenter);

      QFontMetrics fontMetric(painter.font());
      const QString elidedText = QAbstractItemDelegate::elidedText(fontMetric, rect.width(), Qt::ElideRight, this->currentText());
      painter.drawText( rect, elidedText, option);
}

这是完美无缺的。 问题是注释之间的代码,因为我正在硬编码左边界和右边界的距离。这让我很畏缩。

没有该代码的结果是:

enter image description here

在没有硬编码的情况下,有没有人知道这样做的更通用的方法? 谢谢

2 个答案:

答案 0 :(得分:1)

应该精确绘制文本的位置取决于使用的样式。您可以使用QStyle::subControlRect获取有关(部分)子元素定位的信息。与组合框文本匹配的子控件最好似乎是QStyle::SC_ComboBoxEditField,但如果项目有图标,则也需要考虑这一点。如果项目没有图标,您可以使用

  QRect textRect = style()->subControlRect(QStyle::CC_ComboBox, &opt, QStyle::SC_ComboBoxEditField, this);
  QFontMetrics fontMetric(painter.font());
  const QString elidedText = QAbstractItemDelegate::elidedText(fontMetric, textRect.width(), Qt::ElideRight, this->currentText());
  opt.currentText = elidedText;
  painter.drawControl(QStyle::CE_ComboBoxLabel, opt);

您可能想了解一下如何QFusionStyle::drawControl可以提供详细信息。

一般情况下,如果您希望所有组合框都忽略该文字,则应考虑实施自己的QProxyStyle,并仅覆盖MyStyle::drawControl的{​​{1}}。

答案 1 :(得分:0)

这是我一直在使用的解决方案:

void CustomComboBox::paintEvent(QPaintEvent * /*event*/)
{
    QStyleOptionComboBox opt;
    initStyleOption(&opt);

    QStylePainter p(this);
    p.drawComplexControl(QStyle::CC_ComboBox, opt);

    QRect textRect = style()->subControlRect(QStyle::CC_ComboBox, &opt, QStyle::SC_ComboBoxEditField, this);
    opt.currentText = p.fontMetrics().elidedText(opt.currentText, Qt::ElideRight, textRect.width());
    p.drawControl(QStyle::CE_ComboBoxLabel, opt);
}

这种方法与示例代码和建议的代码段E4z9的组合非常相似。我只是以为将来会来这里的其他人也可以使用整个方法。