繁体   English   中英

UI中的动态QLabel错位

[英]Dynamic QLabel misplacing in UI

我正在尝试创建一个程序,该程序通过拖放接受图像并在UI上显示这些图像,然后我想重命名它们并保存它们。

我可以进行拖放操作,但是图像放置存在一些问题,而且似乎找不到我犯错的地方。

在图像中,您可以看到运行时的UI,在左上角,您可以看到我拖动到绿色区域(这是接受图像的拖放区域)中的图像的一部分。 我实际上希望它位于的位置应该是红色正方形。 绿色区域是一个动态创建的对象,称为Imagehandler,我创建该对象是为了处理图像的拖放。 红场是我自己的类,它继承自QLabel,我称之为myiconclass。 该类应保存实际的图像数据。

我认为我的错误与布局有关,但我看不到。

请给我一些帮助吗?

在此处输入图片说明

图像处理程序

#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

主窗口

#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);


}

主窗口

#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;
}

正如本杰明T所说,我必须更改此:

MyIconClass * myLabel = new MyIconClass(this);

到这个:

MyIconClass * myLabel = new MyIconClass(ImageHandlerMemory);

谢谢本杰明!

PS,我还必须在我的mainwindow构造函数中添加以下行:

grid2 = new QGridLayout;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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