Unsolved Widget in my class does not set dirty the model
-
I was suggesting a real property like described here and if you take the overload of setMapping with three arguments, you can pass it the name of the property the mapper should use to interact with.
-
SGaist good morning.
You were right, I did it the way you suggested and works perfectly!!
Well, almost perfectly.
I still have to set the model 'manually' using the Signal imageDropped(which is emitted after image drop):
(now the imagetext() is a property)connect(ui.photo_lbl,SIGNAL(imageDropped(QString)),this, SLOT(setModelPhoto(QString))); ..................... } void RepairDevices::setModelPhoto(QString file) { model->setData(model->index(mapper->currentIndex(), photoIndex), file); }
-
Are you emitting the corresponding notify signal when the image changes ?
-
When I change it dropping an image:
void ImageLabel::dropEvent(QDropEvent *event) { ....blah blah blah... QString mimeDataText = mimeData->text(); setImagetext(mimeDataText); emit imageDropped(mimeDataText); }
In 2nd line, the setImagetext causes imagetextChanged to be emitted (in the setter( function setImagetext () )).
In line 3, signal imageDropped is emitted (this signal is used for 'manual' setData of the model).
You mean some of these two?Or maybe this one:
Q_PROPERTY(QString Imagetext READ imagetext WRITE setImagetext NOTIFY imagetextChanged)
-
Also when I load a photo with QFileDialog, I have to set the data for the model 'manually'.
I suppose I can't do something about this, right? -
I meant imagetextChanged.
It will depend on how you load that photo after you used your dialog.
-
This is the code in the button that opens the QFileDialog:
void RepairDevices::on_insert_photo_btn_clicked() { QString initialFolder = qApp->applicationDirPath() + QDir::separator() + "images"; QString fileName = QFileDialog::getOpenFileName(this, tr("Load image"),initialFolder, tr("Image Files (*.png *.jpg *.bmp)")); ui.photo_lbl->setImagetext(fileName); model->setData(model->index(mapper->currentIndex(), photoIndex), fileName); }
-
This is my class' header:
#ifndef IMAGELABEL_H #define IMAGELABEL_H #include <QWidget> #include <QLabel> #include <qdebug.h> #include <QDragEnterEvent> #include <QDropEvent> #include <QMimeData> #include <QDebug> #include <QPixmap> class ImageLabel : public QLabel { Q_OBJECT Q_PROPERTY(QString Imagetext READ imagetext WRITE setImagetext NOTIFY imagetextChanged) public: ImageLabel(QWidget *parent = 0); QString Imagetext; void setImagetext(QString newValue); QString imagetext(); signals: void imageDropped(QString file); void imagetextChanged(QString file); public slots: protected: void dropEvent(QDropEvent *event) override; void dragEnterEvent(QDragEnterEvent *event) override; void dragMoveEvent(QDragMoveEvent *event) override; void dragLeaveEvent(QDragLeaveEvent *event) override; private: QString m_imagetext; }; #endif // IMAGELABEL_H
This is the source:
#include "imagelabel.h" ImageLabel::ImageLabel(QWidget *parent) : QLabel(parent) { setAcceptDrops(true); m_imagetext=""; } void ImageLabel::dropEvent(QDropEvent *event) { const QMimeData *mimeData = event->mimeData(); if (mimeData->hasImage()) { setPixmap(qvariant_cast<QPixmap>(mimeData->imageData())); } else if (mimeData->hasHtml()) { setText(mimeData->html()); setTextFormat(Qt::RichText); } else if (mimeData->hasText()) { setText(mimeData->text()); setTextFormat(Qt::PlainText); // remove string "file:///" from mimeData->text() QString subStr = QLatin1String("file:///"); QLatin1String newStr = QLatin1String(""); QString mimeDataText = QString(mimeData->text().replace(mimeData->text().indexOf(subStr), subStr.size(), newStr)); setImagetext(mimeDataText); emit imageDropped(mimeDataText); } else if (mimeData->hasUrls()) { QList<QUrl> urlList = mimeData->urls(); QString text; for (int i = 0; i < urlList.size() && i < 32; ++i) text += urlList.at(i).path() + QLatin1Char('\n'); setText(text); } else { setText(tr("Cannot display data")); } setBackgroundRole(QPalette::Dark); event->acceptProposedAction(); } void ImageLabel::dragEnterEvent(QDragEnterEvent *event) { setBackgroundRole(QPalette::Highlight); event->acceptProposedAction(); } void ImageLabel::dragMoveEvent(QDragMoveEvent *event) { event->acceptProposedAction(); } void ImageLabel::dragLeaveEvent(QDragLeaveEvent *event) { clear(); event->accept(); } void ImageLabel::setImagetext(QString newValue) { m_imagetext = newValue; if(!m_imagetext.isEmpty()){ QPixmap pixmap(m_imagetext); pixmap = pixmap.scaled(width(), height(), Qt::KeepAspectRatio); setPixmap(pixmap); }else{ clear(); } emit imagetextChanged(m_imagetext); } QString ImageLabel::imagetext() { return m_imagetext; }
It's mapped through my custom property "Imagetext":
mapper->addMapping(ui.photo_lbl, photoIndex, "Imagetext");
When an image is dropped, the label sends a signal named 'imageDropped'.
I use this signal to save the new value of the image path in the model:
connect(ui.photo_lbl,SIGNAL(imageDropped(QString)),this, SLOT(setModelPhoto(QString))); ..................... void RepairDevices::setModelPhoto(QString file) { model->setData(model->index(mapper->currentIndex(), photoIndex), file); }
So this way I set the model 's data.
I hope this helps.
-
No directly related but your getter should rather be
QString imagetext() const;
and you should also ratherconst QString &
in your setter.That will avoid needless copies.
-
I made the changes you suggested SGaist, thanks.