首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QStyledItemDelegate中的字体度量

QStyledItemDelegate中的字体度量
EN

Stack Overflow用户
提问于 2021-02-18 22:18:08
回答 1查看 81关注 0票数 0

我需要找出在QTableView的一个项目中绘制的文本(不是整个单元格,只是文本)的宽度,我需要在QStyledItemDelegate的重写的paint()方法中找到这个宽度。我试过的是:

代码语言:javascript
复制
void SqlQueryItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    // data
    QString text = displayText(index.data(), option.locale);
    int textWidth = option.fontMetrics.horizontalAdvance(text);
    qDebug() << textWidth;
}

...but这给出的值比预期值略小。DEBUG上打印的是509,而我在屏幕上测量的文本大约是545px:

我做错了什么?如何获得要绘制的文本的真实宽度?

这是在带有Qt 5.15.2的Windows 10下。

编辑:如果这很重要,下面是我实现的paint()方法的完整正文:

代码语言:javascript
复制
void SqlQueryItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QStyledItemDelegate::paint(painter, option, index);
    SqlQueryItem* item = getItem(index);

    if (item->isUncommitted())
    {
        painter->setPen(item->isCommittingError() ? QColor(Qt::red) : QColor(Qt::blue));
        painter->setBrush(Qt::NoBrush);
        painter->drawRect(option.rect.x(), option.rect.y(), option.rect.width()-1, option.rect.height()-1);
    }

    if (item->isLimitedValue())
    {
        QString text = displayText(item->getValue(), option.locale);
        int textWidth = option.fontMetrics.boundingRect(text).width();
        int margin = QApplication::style()->pixelMetric(QStyle::PM_FocusFrameHMargin, nullptr, option.widget) + 1; // from QCommonStyle source code
        if (option.rect.width() >= (textWidth + LOAD_FULL_VALUE_BUTTON_SIZE + 4 + (margin * 2)))
        {
            QStyleOptionButton button = fullValueButtonOption;
            button.rect = getLoadFullValueButtonRegion(option.rect);
            button.state = QStyle::State_Enabled | QStyle::State_MouseOver;
            if (lmbPressedOnButton)
                button.state |= QStyle::State_Sunken | QStyle::State_Active;

            QApplication::style()->drawControl(
                        mouseOverFullDataButton ? QStyle::CE_PushButton : QStyle::CE_PushButtonLabel,
                        &button, painter);
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2021-02-19 17:30:34

找到解决方案了!

在测量任何东西之前,我需要先拥有选项的本地副本并对其进行初始化:

代码语言:javascript
复制
QStyleOptionViewItem opt = option;
initStyleOption(&opt, index);
int textWidth = opt.fontMetrics.boundingRect(text).width();

只有在初始化选项后,它里面的字体才被更改为用于呈现的实际字体(我在调试中验证了它,字体被更改了),并且horizontalAdvance()boundingRect()都返回了正确的宽度。

前面我错误地假设传递给paint()方法的选项已经初始化。这不是真的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66261818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档