【问题标题】:QComboBox elided text on selected itemQComboBox在所选项目上省略了文本
【发布时间】:2017-05-12 15:39:20
【问题描述】:

所以,我有一个 QComboBox

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

像这样:

所以:

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);
}

这是完美的工作。 问题是 cmets 之间的代码,因为我在硬编码左右边界的距离。它让我畏缩。

没有该代码的结果是:

有人知道没有硬编码的更通用的方法吗? 谢谢

【问题讨论】:

    标签: qt5 ellipsis qcombobox


    【解决方案1】:

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

    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);
    }
    

    这种方法与您的示例代码和建议的 sn-p E4z9 的组合非常相似。我只是想我会将整个方法包括在内,以供将来来到这里的其他人使用。

    【讨论】:

    • 试过这个方法,调试输出显示正确的初始文本,并且被正确省略,但在 UI 中仍然显示初始的非省略文本。更奇怪的是,如果我注释掉整个方法体内容,标签仍然被绘制,没有其他任何东西,没有按钮,没有组合框的框架,只有带有非省略文本的标签。我错过了什么吗?
    • @DamirPorobic,我刚刚检查过,上面的实现正是我们多年来一直在发布的,没有任何报告的问题。如果您注释掉 paintEvent 的正文,小部件将不会绘制任何内容,这意味着您看到绘制的任何内容都必须来自其他地方。
    【解决方案2】:

    应该在哪里绘制文本取决于使用的样式。您可以使用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,并且只为QStyle::CE_ComboBoxLabel 覆盖MyStyle::drawControl

    【讨论】:

    • 感谢您的建议。我有时间会尽快调查您的建议!
    猜你喜欢
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多