我在 Windows 10 上使用 Qt 6.5,我的应用程序上的像素图根据当前 DPI 进行不同的缩放。
最小的可重现示例:
Windows 比例 100%
缩放125%
缩放150%
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%)
(DPI100%)
我如何解决这个 dpi 问题?
试试这个:
label_2->setPixmap(roundedPixmap.scaled(label2->size()));
无论如何我不喜欢使用 QLabels 来显示图像,因为 QLabel 有你不喜欢的属性:尝试 myLabel.setEnabled(false)