- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
过去几天我一直在为这个问题苦苦挣扎。当用户调整窗口大小时,我希望能够扩大和缩小 QLabel 中分配的任何 Pixmap。问题是保持纵横比和图像质量。这里的另一位用户建议我重新实现标签的绘画事件 - 但我仍然很迷茫。我什至不确定我是否正确覆盖了 paintEvent。我会在这里寻找一些示例代码。
这是我所在的地方:
void MyLabel::paintEvent(QPaintEvent * event)
{
//if this widget is assigned a pixmap
//paint that pixmap at the size of the parent, aspect ratio preserved
//otherwise, nothing
}
最佳答案
这是 QLabel
子类的一个可能实现,它在保持纵横比不变的同时缩放其像素图内容。它是基于QLabel::paintEvent
的方式实现的 is implemented .
如果您在布局中使用它,您还可以将其大小策略设置为 QSizePolicy::Expanding
, 以便 QLabel
占用布局中的额外空间,以更大地显示像素图内容。
#include <QApplication>
#include <QtWidgets>
class PixmapLabel : public QLabel{
public:
explicit PixmapLabel(QWidget* parent=nullptr):QLabel(parent){
//By default, this class scales the pixmap according to the label's size
setScaledContents(true);
}
~PixmapLabel(){}
protected:
void paintEvent(QPaintEvent* event);
private:
//QImage to cache the pixmap()
//to avoid constructing a new QImage on every scale operation
QImage cachedImage;
//used to cache the last scaled pixmap
//to avoid calling scale again when the size is still at the same
QPixmap scaledPixmap;
//key for the currently cached QImage and QPixmap
//used to make sure the label was not set to another QPixmap
qint64 cacheKey{0};
};
//based on the implementation of QLabel::paintEvent
void PixmapLabel::paintEvent(QPaintEvent *event){
//if this is assigned to a pixmap
if(pixmap() && !pixmap()->isNull()){
QStyle* style= PixmapLabel::style();
QPainter painter(this);
drawFrame(&painter);
QRect cr = contentsRect();
cr.adjust(margin(), margin(), -margin(), -margin());
int align= QStyle::visualAlignment(layoutDirection(), alignment());
QPixmap pix;
if(hasScaledContents()){ //if scaling is enabled
QSize scaledSize= cr.size() * devicePixelRatioF();
//if scaledPixmap is invalid
if(scaledPixmap.isNull() || scaledPixmap.size()!=scaledSize
|| pixmap()->cacheKey()!=cacheKey){
//if cachedImage is also invalid
if(pixmap()->cacheKey() != cacheKey){
//reconstruct cachedImage
cachedImage= pixmap()->toImage();
}
QImage scaledImage= cachedImage.scaled(
scaledSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
scaledPixmap= QPixmap::fromImage(scaledImage);
scaledPixmap.setDevicePixelRatio(devicePixelRatioF());
}
pix= scaledPixmap;
} else { // no scaling, Just use pixmap()
pix= *pixmap();
}
QStyleOption opt;
opt.initFrom(this);
if(!isEnabled())
pix= style->generatedIconPixmap(QIcon::Disabled, pix, &opt);
style->drawItemPixmap(&painter, cr, align, pix);
} else { //otherwise (if the label is not assigned to a pixmap)
//call base paintEvent
QLabel::paintEvent(event);
}
}
//DEMO program
QPixmap generatePixmap(QSize size) {
QPixmap pixmap(size);
pixmap.fill(Qt::white);
QPainter p(&pixmap);
p.setRenderHint(QPainter::Antialiasing);
p.setPen(QPen(Qt::black, 10));
p.drawEllipse(pixmap.rect());
p.setPen(QPen(Qt::red, 2));
p.drawLine(pixmap.rect().topLeft(), pixmap.rect().bottomRight());
p.drawLine(pixmap.rect().topRight(), pixmap.rect().bottomLeft());
return pixmap;
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QPixmap pixmap= generatePixmap(QSize(1280, 960));
PixmapLabel label;
label.setPixmap(pixmap);
label.setAlignment(Qt::AlignCenter);
label.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
label.setMinimumSize(320, 240);
label.show();
return a.exec();
}
我认为这比 this answer 中的解决方案更好,因为这里的 QLabel
负责调整其像素图的大小。因此,每次调整父窗口小部件的大小时以及每次在其上设置新的像素图时都不需要手动调整它的大小。
关于c++ - Qt 覆盖 QLabel PaintEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40167841/
#include #include int main(int argc, char** argv) { QApplication app(argc, argv); QLabel l
我有一个 QLabel,我想根据它包含的文本(加上侧面的一些边距)调整它的大小。,我已经尝试过: self.WarnLab = QtGui.QLabel(self.HeaderRight) font
我试图从一个函数返回一个 QLabel,但我一直收到错误: /media/root/5431214957EBF5D7/projects/c/qt/tools/plugandpaint/plugins/
我看过很多关于如何使用 paintevent 的示例,但我就是无法让它工作。 我的 .ui 文件中有一个名为“图像”的标签,我正试图在其中绘画。我失败得很惨。在我见过的大多数示例中,他们都使用了 QL
我试图让 QLabel 显示图像和一些与该图像垂直居中的文本。我不知道该怎么做。我在互联网上找到的大多数资源都建议使用以下代码: ui->label->setText(" Hello"); 但是我得到
我正在尝试使用 PyQt 为一段 python 代码制作一个 GUI。但是,由于我不知道的原因,GUI 似乎切断了两个 Qlabel 的末端。我已经针对类似问题浏览了 Stack Overflow 上
我正在尝试在 QLabel 中显示一些 html 代码。虽然 QLabel 正确呈现 html,但超链接实际上不起作用,图像链接只是生成丢失的图标图片而不是显示图像本身。 我猜这是 QLabel 的一
我有一个用样式表填充红色的 QLabel,但 QLabel 是矩形的,我想要一个圆形。我尝试添加边框半径,但它不起作用,可能是因为我将 QLabel 放在了 formLayout 中。 有没有一种简单
我正在实例化一个可编辑的 QLabel,如下所示: QLabel foo("some text"); foo.setTextInteractionFlags(Qt::TextEditorInterac
我想在 QT/PySide2 应用程序中显示圆形图像。 下面是我试过的代码。 self.statusWidget = QLabel() img = QImage(":/image.jpg").scal
如何设置QLabel的文本颜色和背景? 最佳答案 最好和推荐的方法是使用 Qt 样式表。文件:Qt 5 Style Sheet , Qt 6 Style Sheet . 要更改 QLabel 的文本颜
我正在尝试创建带有文本轮廓的标签。我只想要一个带有黑色轮廓的简单白色文本。我首先尝试在 css 中这样做 label.setStyleSheet("color:white; outline:2px b
我正在尝试创建带有文本轮廓的标签。我只想要一个带有黑色轮廓的简单白色文本。我首先尝试在 css 中这样做 label.setStyleSheet("color:white; outline:2px b
我读过这个How to distinguish between mouseReleaseEvent and mousedoubleClickEvent on QGrapnhicsScene还有这个Di
我正在尝试制作一个转盘播放器,当按住鼠标左键并向左或向右拖动时,它可以翻转图像序列。它几乎可以工作并且正在打印出正确的图像名称。但图像本身不会更新/重新绘制。 如果我从 eventFilter 方法的
我有一个这样的段落列表: list1 = [ "something", "more", ... "{ //image// }" "something" ... "{ //i
我自己设置 PyQt 时遇到问题。我的想法是创建一个带有歌曲标题和专辑封面的音乐播放器。我已经成功创建了自己的窗口并添加了专辑封面。但我无法将标签添加到正确的位置。我希望歌曲标题位于窗口的顶部中心,如
当我运行以下代码时,label 小部件 (?) 会显示,即使它尚未添加到任何布局中。我正在遵循的教科书还暗示我不应该看到它(直到我将其添加到布局中),但它无论如何都会出现。我期待看到一个空 windo
我试图在不使用 setScaledContents(True) 的情况下获得完全适合我的标签的图像,因为我希望 ImageGrab 具有与 QLabel 空间完全相同的尺寸。 我使用带有 bbox 的
我有几个 QLabel 实例,我希望这些实例没有边框或背景颜色。我尝试了以下方法: plbl = new QLabel(); plbl->setGeometry(210, 0, 26, 16); pl
我是一名优秀的程序员,十分优秀!