QLabel定位问题

QLabel positioning woes

本文关键字:问题 定位 QLabel      更新时间:2023-10-16

我在Qt中制作了以下基本的图像查看器,但它的行为并不像预期的那样,出于对神圣事物的热爱,我无法找出问题所在。基本上,这是一个QLabel,我将其电影设置为jpeg/gif,然后调整其大小并将其居中显示在屏幕上。问题是,当它启动时,它既不调整大小,也不在屏幕上居中,而是填充窗口并拉伸图像。

示例:https://i.stack.imgur.com/YJf2x.jpg

如果我把它放在QVBoxLayout中,那也是一样的但是,如果我执行缩放/缩放(通过按"+"或"-",如keyRelease事件中所定义),它会将图像居中并完美调整大小。

示例:https://i.stack.imgur.com/1uqd4.png

所以问题似乎只是当它加载图像时,但我找不到在哪里。我知道这一定很简单,但我搜索了Qt文档、谷歌,尝试了注释行的组合和添加不同的功能,但一无所获。

顺便说一句,loadImage函数底部的输出会打印正确的大小和位置,但似乎并不尊重它们。

#include <QtGui>
#include "imageviewer.h"
ImageViewer::ImageViewer(QString imagePath)
{
    setWindowTitle(imagePath + " - Simple Image Viewer");
    currentImageSize=new QSize(0,0);
    fillScreen();
    imageLabel = new QLabel;
    imageLabel->setBackgroundRole(QPalette::Base);
    imageLabel->setScaledContents(true);
    QVBoxLayout* layout=new QVBoxLayout();
    layout->addWidget(imageLabel);
    QFrame* frame=new QFrame();
    frame->setLayout(layout);
    //setCentralWidget(frame);
    setCentralWidget(imageLabel);
    loadImage(imagePath);
}
void ImageViewer::loadImage(QString imagePath){
    currentImagePath=imagePath;
    open(imagePath);
    fitImage();
    centerImage();
    QTextStream out(stdout) ;
    //for debugging:
    out << QString("size: %1 %2 pos: %3 %4")
              .arg(imageLabel->width())
              .arg(imageLabel->height())
              .arg(imageLabel->x())
              .arg(imageLabel->y());
}
void ImageViewer::open(QString imagePath){
      if (!imagePath.isEmpty()) {
        QImage image(imagePath);
        currentImageSize=new QSize(image.size().width(),image.size().height());
        if (image.isNull()) {
            QMessageBox::information(this, tr("Image Viewer"),
                                     tr("Cannot load %1.").arg(imagePath));
            return;
        }
        imageLabel->resize(currentImageSize->width(),
                           currentImageSize->height());
        QMovie* movie=new QMovie(imagePath);
        imageLabel->setMovie(movie);
        movie->start();
        scaleFactor = 1.0;
        imageLabel->adjustSize();
      }
}
void ImageViewer::fitImage(){
    int windowHeight, windowWidth;
    int imageHeight, imageWidth;
    windowHeight = this->height();
    windowWidth = this->width();
    imageHeight = currentImageSize->height();
    imageWidth = currentImageSize->width();
    if(imageHeight > windowHeight || imageWidth > windowWidth){
        imageLabel->resize((windowHeight-40)*imageWidth/imageHeight, 
                            windowHeight-40);
    }
}
void ImageViewer::centerImage(){
    int windowHeight, windowWidth;
    int imageHeight, imageWidth;
    windowHeight = this->height();
    windowWidth = this->width();
    imageHeight = imageLabel->height();
    imageWidth = imageLabel->width();
    int x,y;
    x=(windowWidth-imageWidth)/2;
    y=(windowHeight-imageHeight)/2;
    imageLabel->move(x,y);
}
void ImageViewer::fillScreen(){
    this->showMaximized();
}
void ImageViewer::scaleImage(double factor)
{
    double newScale = scaleFactor + factor;
    if(newScale>MAX_SCALE || newScale<MIN_SCALE){
        return;
    }
    else{
        scaleFactor=newScale;
    }
    QTextStream out(stdout);
    imageLabel->resize(scaleFactor * currentImageSize->width(), 
                       scaleFactor * currentImageSize->height());
    out<< scaleFactor << " " 
       << imageLabel->height() << "," 
       << imageLabel->width() <<endl;
    centerImage();
}

void ImageViewer::keyReleaseEvent(QKeyEvent *event){
    if(event->key()==Qt::Key_Plus){
        scaleImage(SCALE_STEP);
    }
    if(event->key()==Qt::Key_Minus){
        scaleImage(0-(SCALE_STEP));
    }
}

标题为:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QLabel>
#include <QMainWindow>
class ImageViewer : public QMainWindow
{
    Q_OBJECT
public:
    ImageViewer(QString imagePath);
    void open(QString imagePath);
    void loadImage(QString imagePath);
private:
    void fitImage();
    void centerImage();
    void fillScreen();
    void scaleImage(double);
    void adjustScrollBar(QScrollBar*,double);
    void keyReleaseEvent(QKeyEvent *);
private:
    QLabel* imageLabel;
    double scaleFactor;
    QSize* currentImageSize;
    QString currentImagePath;
    QString currentDir;
    QStringList neighbourImages;
    static const double MAX_SCALE=2.0;
    static const double MIN_SCALE=0.2;
    static const double SCALE_STEP=0.1;
};
#endif // MAINWINDOW_H

编辑:这是第一次加载后的QLabel和放大一次后的QLabel之间的差异:diffchecker.com/1uDcb83

我认为问题在于您试图在主窗口构造函数中计算大小。目前尚未确定这些尺寸。您需要覆盖QWidget::resizeEvent()(在ImageViewer中)并在那里进行大小计算。该函数是在设置小部件的几何图形后调用的。