2017-11-13 10 views
0

ドラッグアンドドロップで画像を受け入れ、その画像をUIに表示するプログラムを作成しようとしていますが、その名前を変更して保存します。QT Dynamic QLabelがUI内に配置されていない

私はドラッグアンドドロップで作業することができましたが、私はイメージプレースメントに問題があり、私が間違っている場所を見つけることができません。

実行時にUIが表示されるイメージの左上に、緑色のゾーンにドラッグしたイメージの一部が表示されます(イメージを受け入れるドラッグアンドドロップゾーンです)。私が実際にそれを望む位置は、赤い四角でなければなりません。緑色のゾーンは、画像のドラッグ&ドロップを処理するために作成したImagehandlerというダイナミックに作成されたオブジェクトです。赤い四角形はQLabelを継承する私のクラスです。私はそれをmyiconclassと呼びます。このクラスは、実際の画像データを保持する必要があります。

私の間違いはレイアウトと関係があると思いますか?しかし、私はそれを見ることができない、私はこれでいくつかの助けを得ることができますか?ありがとう!

enter image description here

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; 
} 
+1

これはあなたのメインウィンドウに、代わりに 'QGroupBox'のためにあなたが親あなた' QLabel'です。 parentingはレイアウトを使って行うことができますが、コードが間違っているか不完全で、 'grid2'を初期化する場所が見えず、' grid'ローカル変数が使われていません。 –

+0

Aaah、よろしくお願いします。ありがとう、Grid2私mainwindow.hのinit –

+0

いいえ、それはありません。ポインターをクラスメンバーとして宣言しますが、決して値を割り当てません。 –

答えて

0

ベンジャミンTは、私はこの変更しなければならなかった言ったように:この中

MyIconClass * myLabel = new MyIconClass(this); 

MyIconClass * myLabel = new MyIconClass(ImageHandlerMemory); 

ありがとうBenjamin!

PSは、私も自分のメイン・ウィンドウのコンストラクタに次の行を追加する必要がありました:

grid2 = new QGridLayout; 
関連する問題