我需要找出在QTableView的一个项目中绘制的文本(不是整个单元格,只是文本)的宽度,我需要在QStyledItemDelegate的重写的paint()方法中找到这个宽度。我试过的是:
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()方法的完整正文:
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);
}
}
}发布于 2021-02-19 17:30:34
找到解决方案了!
在测量任何东西之前,我需要先拥有选项的本地副本并对其进行初始化:
QStyleOptionViewItem opt = option;
initStyleOption(&opt, index);
int textWidth = opt.fontMetrics.boundingRect(text).width();只有在初始化选项后,它里面的字体才被更改为用于呈现的实际字体(我在调试中验证了它,字体被更改了),并且horizontalAdvance()和boundingRect()都返回了正确的宽度。
前面我错误地假设传递给paint()方法的选项已经初始化。这不是真的。
https://stackoverflow.com/questions/66261818
复制相似问题