我有一个简单的对话框窗口,其中具有水平布局,并且其中包含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));
}
增加大小效果很好。但是我面临下一个问题:当我尝试缩小窗口时,它无法正常工作。窗口会缩小一点并停止调整大小。在下一次尝试中,它会缩小一些并再次停止,依此类推:第二个奇怪的事情是:如果不释放鼠标按钮,则可以自由调整窗口大小,直到窗口大小大于开始时的大小为止。最大化窗口按钮并返回到先前的大小也很好。如何解决此问题并使窗户树脂正常?
我将完全放下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);
}