2016-12-28 29 views
1

因此,我有一个QComboBoxQComboBox消除选定项目上的文字

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

这是工作flawlessy。 问题是评论之间的代码,因为我硬编码从左边界和右边界的距离。这让我感到害怕。

无代码的结果是:

enter image description here

有谁知道要做到这一点,没有硬编码更一般的方法是什么? 谢谢

回答

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,并且只为QStyle::CE_ComboBoxLabel覆盖MyStyle::drawControl

+0

谢谢你的建议..只要我有一段时间我会尝试调查你的建议! –

+0

它完美无瑕!谢谢! –

相关问题