简体   繁体   中英

Dynamic QLabel misplacing in UI

I'm trying to create a program that accepts images through drag and drop and shows those images on my UI, then I want to rename them and save them.

I got the drag and drop to work, but I have some issues with my Image placement and I can't seem to find where I'm making my mistake.

In the image you see my UI during runtime, in the top left you can see a part of the image I dragged into the green zone(this is my drag and drop zone that accepts images). The position I actually want it to be in should be the red square. The green zone is a Dynamic created object called Imagehandler that I created to handle the drag and drop of the images. The Red square is my own class that inherits from QLabel, I called it myiconclass. This class should hold the actual image data.

I think my mistake has to do with the layouts, but I can't see it.

Could I get some help with this please?

在此处输入图片说明

Imagehandler.h

#ifndef IMAGEHANDLER_H
#define IMAGEHANDLER_H

#include <QObject>
#include <QWidget>
#include <QLabel>
#include <QDrag>
#include <QDragEnterEvent>
#include <QMimeData>
#include <QList>
#include <QDebug>

//this class is designed to help me take in the images with drag and drop

class ImageHandler : public QWidget
{
    Q_OBJECT
public:
    explicit ImageHandler(QWidget *parent = nullptr);




    QList<QImage> getImageListMemory() const;
    void setImageListMemory(const QList<QImage> &value);

    QList<QUrl> getUrlsMemory() const;
    void setUrlsMemory(const QList<QUrl> &value);

private:
    //QWidget Icon;
    QLabel Icon;
    QList <QImage> imageListMemory;
    QList <QUrl> urlsMemory;

protected:
    void dragEnterEvent(QDragEnterEvent * event);
    void dragLeaveEvent(QDragLeaveEvent * event);
    void dragMoveEvent(QDragMoveEvent * event);
    void dropEvent(QDropEvent * event);

signals:
    void transferImageSignal(QList <QImage>);

public slots:
};

#endif // IMAGEHANDLER_H

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QImageReader>
#include <QList>
#include <QWidget>
#include <QLabel>
#include <myiconclass.h>
#include <imagehandler.h>
#include <QGridLayout>
#include <QDebug>


namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

    QList<QImage> getImageListMemory() const;
    void setImageListMemory(const QList<QImage> &value);

private:
    Ui::MainWindow *ui;
    QLabel Icon;
    QList <QImage> imageListMemory;
    QList <QUrl> urlsMemory;
    QList<QWidget *> labelList;
    ImageHandler * ImageHandlerMemory;
    QGridLayout * grid2;
    QList <MyIconClass *> memory;


signals:

public slots:
    void setIconSlot(QList <QImage>);


};

#endif // MAINWINDOW_H

myiconclass.h

#ifndef MYICONCLASS_H
#define MYICONCLASS_H

#include <QWidget>
#include <QLabel>

//this class is based on a Qlabel and is only made so it can help me with the actual images, gives me more members if I need it

class MyIconClass : public QLabel
{
    Q_OBJECT
public:
    explicit MyIconClass(QWidget *parent = nullptr);

    int getMyNumber() const;
    void setMyNumber(int value);

private:
    int myNumber;

signals:

public slots:
};

#endif // MYICONCLASS_H

imagehandler.cpp

#include "imagehandler.h"

ImageHandler::ImageHandler(QWidget *parent) : QWidget(parent)
{
    setAcceptDrops(true);
}

QList<QImage> ImageHandler::getImageListMemory() const
{
    return imageListMemory;
}

void ImageHandler::setImageListMemory(const QList<QImage> &value)
{
    imageListMemory = value;
}

QList<QUrl> ImageHandler::getUrlsMemory() const
{
    return urlsMemory;
}

void ImageHandler::setUrlsMemory(const QList<QUrl> &value)
{
    urlsMemory = value;
}



void ImageHandler::dragEnterEvent(QDragEnterEvent * event)
{
    event->accept();
}

void ImageHandler::dragLeaveEvent(QDragLeaveEvent * event)
{
    event->accept();
}

void ImageHandler::dragMoveEvent(QDragMoveEvent * event)
{
    event->accept();
}

void ImageHandler::dropEvent(QDropEvent * event)
{
    QList <QImage> imageList2;

    QList <QUrl> urls;
    QList <QUrl>::iterator i;
    urls = event->mimeData()->urls();

    //imageList.append(event->mimeData()->imageData());

    foreach (const QUrl &url, event->mimeData()->urls())
    {
            QString fileName = url.toLocalFile();
            qDebug() << "Dropped file:" << fileName;
            qDebug()<<url.toString();


            QImage img;
            if(img.load(fileName))
            {
                imageList2.append(img);
            }



    }


  emit transferImageSignal(imageList2);

    this->setUrlsMemory(urls);
    this->setImageListMemory(imageList2);


}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ImageHandler * handler = new ImageHandler(this);
    handler->show();
    QGridLayout *grid = new QGridLayout;

    grid->addWidget(handler, 0, 0);

    ui->groupBoxIcon->setLayout(grid);

    ImageHandlerMemory = handler;



    //connect(handler,SIGNAL(handler->transferImageSignal(QList <QUrl>)),this,SLOT(setIconSlot(QList <QUrl>)));
    connect(handler,SIGNAL(transferImageSignal(QList<QImage>)),this,SLOT(setIconSlot(QList<QImage>)));


}

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

QList<QImage> MainWindow::getImageListMemory() const
{
    return imageListMemory;
}

void MainWindow::setImageListMemory(const QList<QImage> &value)
{
    imageListMemory = value;
}



void MainWindow::setIconSlot(QList<QImage> images)
{
    printf("succes!");
    this->setImageListMemory(images); //save the images to memory

    QGridLayout *grid = new QGridLayout; //create the grid layout I want my images to be in
    // create counters to remember the row and column in the grid
    int counterRow =0;
    int counterColumn =0;
    int counter3 =0;
    int counterImages = 0;

    //iterate over each image in the list
    QList <QImage>::iterator x;
    for(x = imageListMemory.begin(); x != imageListMemory.end(); x++)
    {
        MyIconClass * myLabel = new MyIconClass(this); //create an object of my own class (which is a Qlabel with an int member)
        QPixmap pixmap(QPixmap::fromImage(*x)); //create a pixmap from the image in the iteration
        myLabel->setPixmap(pixmap); //set the pixmap on my label object
        myLabel->show();
        memory.append(myLabel); //add it to the memory so I can recal it
        counterImages++;


    }

    while(counter3 < images.count())
    {
        grid2->addWidget(memory.value(counter3), counterRow, counterColumn);

        counterColumn++;
        counter3++;
        if(counterColumn >= 5)
        {
            counterRow++;
            counterColumn =0;
        }

    }
    if(ImageHandlerMemory->layout() == 0)
    {
        ImageHandlerMemory->setLayout(grid2);    
    }

}

myiconclass.cpp

#include "myiconclass.h"

MyIconClass::MyIconClass(QWidget *parent) :  QLabel(parent)
{

}

int MyIconClass::getMyNumber() const
{
    return myNumber;
}

void MyIconClass::setMyNumber(int value)
{
    myNumber = value;
}

As Benjamin T said I had to change this:

MyIconClass * myLabel = new MyIconClass(this);

into this:

MyIconClass * myLabel = new MyIconClass(ImageHandlerMemory);

Thanks Benjamin!

PS, I also had to add this line in my mainwindow constructor:

grid2 = new QGridLayout;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM