高 DPI 导致像素图缩放错误

问题描述 投票:0回答:1

我在 Windows 10 上使用 Qt 6.5,我的应用程序上的像素图根据当前 DPI 进行不同的缩放。

最小的可重现示例

Windows 比例 100%

del_YcpVZze4Xo.png

缩放125%

del_KFwUNzwjVc.png

缩放150%

del_KkC7k6lJzQ.png

class Label : public QLabel
{
    Q_OBJECT
public:
    QIcon icon;
    Label(QWidget* parent = nullptr) : QLabel(parent){}
    void paintEvent(QPaintEvent* event) override
    {
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing);
        painter.setRenderHint(QPainter::SmoothPixmapTransform);
        icon.paint(&painter, rect(), Qt::AlignCenter, QIcon::Normal, QIcon::On);
    }
};

inline QPixmap setRoundness(QPixmap pixmap, int roundness)
{
    QPainterPath path;
    qDebug() << pixmap.width() << pixmap.height();
    // Round the pixmap by 50%
    path.addRoundedRect(QRectF(0, 0, pixmap.width(), pixmap.height()), pixmap.width() / 2, pixmap.height() / 2);

    QPixmap roundedPixmap = QPixmap(pixmap.size());
    roundedPixmap.fill(Qt::transparent);
    QPainter painter(&roundedPixmap);
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setRenderHint(QPainter::SmoothPixmapTransform);
    painter.fillPath(path, Qt::black);
    painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
    painter.drawPixmap(0, 0, pixmap);

    pixmap.save("test_1.png");
    roundedPixmap.save("test_2.png");
    return roundedPixmap;
}

class MainWindow : public QMainWindow
{
   Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr) : QMainWindow(parent), ui(new Ui::MainWindowClass())
{
      ui->setupUi(this);
      setStyleSheet("#centralWidget { background-color: rgba(80, 80, 80, 80); }");

      QIcon icon = QIcon("C:/Users/Katia/test.png"); // test.png => https://i.imgur.com/cZfWHkW.png
      QPixmap roundedPixmap = setRoundness(icon.pixmap(QSize(55, 55)), 50);

      Label* label = new Label;
      label->icon = roundedPixmap;
      QLabel* label_2 = new QLabel;
      label_2->setPixmap(roundedPixmap);

      QWidget* widget = new QWidget;
      QHBoxLayout* hLayout = new QHBoxLayout(widget);
      hLayout->addWidget(label);
      hLayout->addWidget(label_2);
      hLayout->setContentsMargins(0, 0, 0, 0);
      hLayout->setSpacing(30);

      setCentralWidget(widget);
      setContentsMargins(32, 32, 32, 32);
      return;
   }
}

这是QPixmap中的问题,而不是QPaintEvent中的问题,因为当我保存

roundedPixmap.save("test_2.png");
时,这就是我得到的:

(DPI 150%) x2.png

(DPI100%) x2.png

我如何解决这个 dpi 问题?

c++ windows qt dpi highdpi
1个回答
0
投票

试试这个:

label_2->setPixmap(roundedPixmap.scaled(label2->size()));

无论如何我不喜欢使用 QLabels 来显示图像,因为 QLabel 有你不喜欢的属性:尝试 myLabel.setEnabled(false)

© www.soinside.com 2019 - 2024. All rights reserved.