Git commit f55594b5900ecb38c3ff74d5ef128218f9fdb444 by Barth Netterfield. Committed on 31/01/2016 at 21:30. Pushed by netterfield into branch 'master'. Some device pixel ratio fun. The curve dialog seems to work in a generally DPI independent way now. Assuming there isn't different sorts of inconsistent Qt behavior on other OSs. We shall see. M +2 -0 src/kst/main.cpp M +33 -13 src/widgets/curveappearance.cpp http://commits.kde.org/kst-plot/f55594b5900ecb38c3ff74d5ef128218f9fdb444 diff --git a/src/kst/main.cpp b/src/kst/main.cpp index 93aa0d9..9ade1f4 100644 --- a/src/kst/main.cpp +++ b/src/kst/main.cpp @@ -67,6 +67,8 @@ int main(int argc, char *argv[]) { app.installTranslator(&kstDirectoryTranslator); = #ifdef QT5 + // use high res pixmaps if pixel-doubling is in effect. + // But there is are still odd bugs, so don;t get too excited. app.setAttribute(Qt::AA_UseHighDpiPixmaps, true); #endif = diff --git a/src/widgets/curveappearance.cpp b/src/widgets/curveappearance.= cpp index a9715d0..b7619ed 100644 --- a/src/widgets/curveappearance.cpp +++ b/src/widgets/curveappearance.cpp @@ -99,7 +99,7 @@ void CurveAppearance::populateSymbolCombo(QComboBox *comb= o, QColor symbolColor) int currentItem =3D combo->currentIndex(); combo->clear(); QPen pen(symbolColor); - pen.setWidthF(h/12.0); + pen.setWidthF(h/18.0); pp.setPen(pen); = for (int ptype =3D 0; ptype < KSTPOINT_MAXTYPE; ptype++) { @@ -441,22 +441,40 @@ void CurveAppearance::populateLineStyleCombo() { = = void CurveAppearance::drawSampleLine() { - //_label->resize(_label->height()*7, _label->height()); - QPixmap pix(_label->contentsRect().width(), _label->contentsRect().heigh= t()); + // In some OSs, HiDPI is handled by setting the device pixel ratio so th= at + // logical pixels are not physical pixels. However, not all Qt functions + // seem to play well in this universe, requiring some... entertainment. + + int pixel_ratio =3D _label->devicePixelRatio(); + int h =3D fontMetrics().lineSpacing()*3/2; + _label->resize(h*5, h); + QPixmap pix(_label->contentsRect().width()*pixel_ratio, + _label->contentsRect().height()*pixel_ratio); + + pix.setDevicePixelRatio(_label->devicePixelRatio()); + + int pix_w =3D pix.width()/pixel_ratio; + int pix_h =3D pix.height()/pixel_ratio; + + QPainter p(&pix); - QPen pen(color(),lineWidth(),LineStyle[lineStyle()]); + + int line_width =3D lineWidth()*fontMetrics().lineSpacing()/18; + + QPen pen(color(),line_width,LineStyle[lineStyle()]); = p.fillRect(p.window(), QColor("white")); = + if (showBars()) { - QRect rectBar((pix.width()-pix.height())/2, - pix.height()/2, - pix.height(), - (pix.height()/2)+1); + QRect rectBar((pix_w-pix_h)/2, + pix_h/2, + pix_h, + (pix_h/2)+1); = = p.fillRect(rectBar,QBrush(QColor(barFillColor()))); - p.setPen(QPen(QColor(color()),lineWidth(), LineStyle[lineStyle()])); + p.setPen(QPen(QColor(color()),line_width, LineStyle[lineStyle()])); p.drawRect(rectBar); } = @@ -473,23 +491,25 @@ void CurveAppearance::drawSampleLine() { p.setPen(pen); if (showLines()) { if (showHead()) { - p.drawLine(1, pix.height()/2, pix.width()-10, pix.height()/2); + p.drawLine(1, pix_h/2, pix_w-10, pix_h/2); } else { - p.drawLine(1, pix.height()/2, pix.width()-1, pix.height()/2); + p.drawLine(1, pix_h/2, pix_w-1, pix_h/2); } } = + h =3D fontMetrics().lineSpacing() * pointSize()*12/font().pointSizeF()/5= 6; + if (showPoints()) { pen.setStyle(Qt::SolidLine); p.setPen(pen); - CurvePointSymbol::draw(pointType(), &p, pix.width()/2, pix.height()/2,= 1.0/2.7*pointSize()); + CurvePointSymbol::draw(pointType(), &p, pix_w/2, pix_h/2, h); } = if (showHead()) { pen.setStyle(Qt::SolidLine); pen.setColor(headColor()); p.setPen(pen); - CurvePointSymbol::draw(headType(), &p, pix.width()-10, pix.height()/2,= 1.0/2.7*pointSize()); + CurvePointSymbol::draw(headType(), &p, pix_w-10, pix_h/2, h); } _label->setPixmap(pix); }