/*! \reimp */ QSize QToolButton::sizeHint() const { Q_D(const QToolButton); if (d->sizeHint.isValid()) return d->sizeHint; ensurePolished(); int w = 0, h = 0; QStyleOptionToolButton opt; initStyleOption(&opt); QFontMetrics fm = fontMetrics(); if (opt.toolButtonStyle != Qt::ToolButtonTextOnly) { QSize icon = opt.iconSize; w = icon.width(); h = icon.height(); #ifdef Q_WS_MAC extern CGFloat qt_mac_get_scalefactor(); w /= qt_mac_get_scalefactor(); h /= qt_mac_get_scalefactor(); #endif } if (opt.toolButtonStyle != Qt::ToolButtonIconOnly) { QSize textSize = fm.size(Qt::TextShowMnemonic, text()); textSize.setWidth(textSize.width() + fm.width(QLatin1Char(' '))*2); if (opt.toolButtonStyle == Qt::ToolButtonTextUnderIcon) { h += 4 + textSize.height(); if (textSize.width() > w) w = textSize.width(); } else if (opt.toolButtonStyle == Qt::ToolButtonTextBesideIcon) { w += 4 + textSize.width(); if (textSize.height() > h) h = textSize.height(); } else { // TextOnly w = textSize.width(); h = textSize.height(); } } opt.rect.setSize(QSize(w, h)); // PM_MenuButtonIndicator depends on the height if (d->popupMode == MenuButtonPopup) w += style()->pixelMetric(QStyle::PM_MenuButtonIndicator, &opt, this); d->sizeHint = style()->sizeFromContents(QStyle::CT_ToolButton, &opt, QSize(w, h), this). expandedTo(QApplication::globalStrut()); return d->sizeHint; }
void StyleHelper::drawPixmapWithScreenScaleFactor(QPainter* p, const QRect& rcOrign, const QPixmap& pix) { if (pix.isNull()) return; #ifdef Q_OS_MAC float factor = qt_mac_get_scalefactor(0); QRect rcTarget(rcOrign); rcTarget.setWidth(rcTarget.width() * factor); rcTarget.setHeight(rcTarget.height() * factor); QTransform transRect; transRect.scale(factor, factor); QPoint leftTop = transRect.map(rcOrign.topLeft()); rcTarget.moveTopLeft(leftTop); // float rFactor = 1 / factor; QTransform transPainter; transPainter.scale(rFactor, rFactor); // p->save(); p->setWorldTransform(transPainter); p->drawPixmap(rcTarget, pix); p->restore(); #else p->drawPixmap(rcOrign, pix); #endif }
void QPixmapIconEngine::paint(QPainter *painter, const QRect &rect, QIcon::Mode mode, QIcon::State state) { QSize pixmapSize = rect.size(); #if defined(Q_WS_MAC) pixmapSize *= qt_mac_get_scalefactor(); #endif painter->drawPixmap(rect, pixmap(pixmapSize, mode, state)); }
void StyleHelper::initPainterByDevice(QPainter* p) { #ifdef Q_OS_MAC float factor = qt_mac_get_scalefactor(0); // factor == 2 on retina QTransform trans; trans.scale(factor, factor); p->setWorldTransform(trans); #endif }
QPixmap StyleHelper::pixmapFromDevice(const QSize& sz) { #ifdef Q_OS_MAC float factor = qt_mac_get_scalefactor(0); // factor == 2 on retina QSize sz2 = sz * factor; #else QSize sz2 = sz; #endif return QPixmap(sz2); }
int StyleHelper::avatarHeight(bool bNoScreenFactor) { QFont f; int nHeight = fontHead(f) + fontNormal(f) + margin() * 3 ; if (bNoScreenFactor) return nHeight; #ifdef Q_OS_LINUX return nHeight; #else float factor = qt_mac_get_scalefactor(0); return nHeight * factor; #endif }
void CWizUserInfoWidgetBase::paintEvent(QPaintEvent *event) { Q_UNUSED(event); int nAvatarWidth = 32; int nArrawWidth = 10; int nMargin = 4; QStyleOptionToolButton opt; initStyleOption(&opt); QPainter p(this); p.setClipRect(opt.rect); // draw user avatar QRect rectIcon = opt.rect; rectIcon.setLeft(rectIcon.left()); rectIcon.setRight(rectIcon.left() + nAvatarWidth); #ifdef Q_OS_MAC float factor = qt_mac_get_scalefactor(0); nAvatarWidth *= factor; #endif // QPixmap pixmap = getAvatar(nAvatarWidth, nAvatarWidth); Utils::StyleHelper::drawPixmapWithScreenScaleFactor(&p, rectIcon, pixmap); //if (!opt.icon.isNull()) { // opt.icon.paint(&p, rectIcon); //} // draw vip indicator QRect rectVip = rectIcon; rectVip.setLeft(rectVip.right() + nMargin); rectVip.setRight(rectVip.left() + fontMetrics().width(opt.text)); //rectVip.setBottom(rectVip.top() + rectVip.height()/2); //if (!m_iconVipIndicator.isNull()) { // m_iconVipIndicator.paint(&p, rectVip, Qt::AlignLeft|Qt::AlignTop); //} // draw display name QRect rectText = rectVip; //rectText.setBottom(rectText.bottom() + rectVip.height()); //rectText.setTop(rectText.bottom() - rectVip.height()); if (!opt.text.isEmpty()) { if (opt.state & QStyle::State_MouseOver) { QFont font = p.font(); font.setUnderline(true); p.setFont(font); } p.setPen("#787878"); // FIXME p.drawText(rectText, Qt::AlignLeft|Qt::AlignVCenter, opt.text); } // draw arraw QRect rectArrow = rectText; rectArrow.setLeft(rectArrow.right() + nMargin); rectArrow.setRight(rectArrow.left() + nArrawWidth); QIcon arrow = getArrow(); if (!arrow.isNull()) { arrow.paint(&p, rectArrow, Qt::AlignVCenter, QIcon::Normal); } }