包含图像窗口大小调整的QT每隔几个像素就会停止一次

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

我有一个简单的对话框窗口,其中具有水平布局,并且其中包含QLable。QLable包含图像。我使用resize事件来缩放此图像以适合窗口大小。

我使用了来自QT示例的代码。标头:

#ifndef SCALEIMGDIALOG_H
#define SCALEIMGDIALOG_H

#include <QDialog>
#include <QLabel>

namespace Ui {
    class ScaleImgDialog;
}

class ScaleImgDialog : public QDialog
{
    Q_OBJECT

public:
    explicit ScaleImgDialog(QWidget *parent = 0);
    ~ScaleImgDialog();

protected:
    void resizeEvent(QResizeEvent *event) override;

private:
    Ui::ScaleImgDialog *ui;
    QPixmap testImg;
};

#endif

和源文件:

#include <QDebug>
#include "scaleImgDialog.h"
#include "ui_scaleImgDialog.h"
// main dialog window name is ScaleImgDialog ui_scaleImgDialog.h is generated automatically

ScaleImgDialog::ScaleImgDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::ScaleImgDialog),
    testImg(":/images/testImg.jpeg")
{
    ui->setupUi(this);
    setWindowFlags(windowFlags() ^ Qt::WindowContextHelpButtonHint);
    setWindowFlags(windowFlags() | Qt::WindowMaximizeButtonHint);
}

ScaleImgDialog::~ScaleImgDialog()
{
    delete ui;
}

void ScaleImgDialog::resizeEvent(QResizeEvent *)
{
    int newHeight = height();
    newHeight -= newHeight / 10;   // to prevent recursive resizing
    // Image heigh is much bigger then width so i use scaling by it
    ui->imgDisplayLabel->setPixmap(testImg.scaledToHeight(newHeight));
}

增加大小效果很好。但是我面临下一个问题:当我尝试缩小窗口时,它无法正常工作。窗口会缩小一点并停止调整大小。在下一次尝试中,它会缩小一些并再次停止,依此类推:scaling problem第二个奇怪的事情是:如果不释放鼠标按钮,则可以自由调整窗口大小,直到窗口大小大于开始时的大小为止。最大化窗口按钮并返回到先前的大小也很好。free resize with pressed mouse button如何解决此问题并使窗户树脂正常?

qt image-resizing window-resize
1个回答
0
投票

我将完全放下resizeEvent,并覆盖paintEvent,以将对话框本身用作绘制设备并直接在其上绘制像素图(这使QLabel不再需要)。

类似:

#include <QPainter>
void ScaleImgDialog::paintEvent(QPaintEvent *event)
{
    QSize size(width()-20, height() - 20);
    QPixmap pixmap = testImg.scaled(size, Qt::KeepAspectRatio);
    QRect area(rect().center() - pixmap.rect().center(), pixmap.rect().size());
    QPainter painter(this);
    painter.drawPixmap(area, pixmap);
}
© www.soinside.com 2019 - 2024. All rights reserved.