Seite 1 von 1
kurze Frage zu QGraphicsItem
Verfasst: 11. August 2015 17:20
von ReasyEasyPeasy
Moin,
ich versuche im Moment einen PostIt zu porgrammieren. Ganz einfach von QGraphicsItem abgeleitet.
Code: Alles auswählen
#ifndef POSTIT_H
#define POSTIT_H
#include <QGraphicsItem>
#include <QPainter>
#include <QRectF>
#include <QTextItem>
#include <QGraphicsTextItem>
class PostIt : public QGraphicsItem
{
public:
PostIt(QGraphicsItem* parent = NULL);
protected:
void paint(QPainter *painter,
const QStyleOptionGraphicsItem *option,
QWidget *widget);
QRectF boundingRect() const;
};
#endif // POSTIT_H
Code: Alles auswählen
#include "../header/postit.h"
PostIt::PostIt(QGraphicsItem* parent) : QGraphicsItem(parent){
setFlag(QGraphicsItem::ItemIsMovable);
}
QRectF PostIt::boundingRect() const{
return QRectF(0,0,400,400);
}
void PostIt::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){
painter->setPen(Qt::black);
painter->setBrush(Qt::yellow);
painter->drawRoundedRect(0,0,400,400,5,5);
painter->drawRoundedRect(0,0,200,100,5,2);
painter->drawText(4,30,"Test");
}
Der Text soll nun beim anklicken editierbar sein. Wie realisier ich das?
Ich hatte ausßerdem probiert ein weiteres QGraphicsItem zu erstellen. Eine kleine Box und dieses Item in mein PostIt zu malen. Was muss ich da beachten?
Ich hänge schon sehr lange an diesem Problem und würde mich über tatkräftige Unterstützungm freuen! Die Dokumentation habe ich bereits angeguckt und kann mir das damit leider nicht erklären.
Liebe Grüße

Re: kurze Frage zu QGraphicsItem
Verfasst: 11. August 2015 20:51
von odt
Platziere ein QGraphicsTextItem in Dein PostIt (im PostIt-Konstruktor ein new QGraphicsTextItem( this )), evt. bei Bedarf (click) sichtbar machen.
Re: kurze Frage zu QGraphicsItem
Verfasst: 12. August 2015 12:22
von ReasyEasyPeasy
Vielen Dank es klappt! Ich hätte allerdings noch ein Problem bei dem du mir vielleicht helfen kannst?!:)
Ich möchte es ermöglichen, dass man ein Bild in mein PostIt zieht und dieses dann dort angezeigt wird.Dies will mit aber einfach nicht gelingen.
DAs Kästchen in das man die Bilder ziehen soll:
Code: Alles auswählen
#ifndef DRAGDROPRECT_H
#define DRAGDROPRECT_H
#include <QGraphicsItem>
#include <QPainter>
#include <QRectF>
#include <QTextItem>
#include <QGraphicsTextItem>
#include <Qpen>
#include <QGraphicsSceneDragDropEvent>
#include <QMimeData>
#include <QImage>
#include <QCoreApplication>
#include <Qcolor>
#include <QPixmap>
class DragDropRect : public QGraphicsItem
{
public:
DragDropRect(QGraphicsItem* parent = NULL);
QBrush brush1;
QImage image;
QImage getImage();
bool dragOver;
QColor color;
QPixmap pixmap;
protected:
void paint(QPainter *painter,
const QStyleOptionGraphicsItem *option,
QWidget *widget);
QRectF boundingRect() const;
void dragEnterEvent(QGraphicsSceneDragDropEvent *event) Q_DECL_OVERRIDE;
void dragLeaveEvent(QGraphicsSceneDragDropEvent *event) Q_DECL_OVERRIDE;
void dropEvent(QGraphicsSceneDragDropEvent *event) Q_DECL_OVERRIDE;
};
#endif // DRAGDROPRECT
Code: Alles auswählen
#include "../header/dragdroprect.h"
#include <QMessageBox>
DragDropRect::DragDropRect(QGraphicsItem* parent) : QGraphicsItem(parent),dragOver(false),color(Qt::lightGray){
setAcceptDrops(true);
}
QRectF DragDropRect::boundingRect() const{
return QRectF(0,0,100,100);
}
void DragDropRect::dropEvent(QGraphicsSceneDragDropEvent *event)
{
event->setAccepted(true);
image = qvariant_cast<QImage>(event->mimeData()->imageData());
pixmap = qvariant_cast<QPixmap>(event->mimeData()->imageData());
dragOver=true;
}
QImage DragDropRect::getImage()
{
return image;
}
void DragDropRect::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
{
}
void DragDropRect::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
{
}
void DragDropRect::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){
QPen pen1(Qt::DashLine);
painter->setPen(pen1);
painter->setBrush(dragOver ? color.light(130) : color);
painter->drawRoundedRect(boundingRect(),5,5);
painter->drawText(4,50,"Foto hierhin ziehen");
}
Und mein PostIt in dem das Bild abgebildet werden soll:
Code: Alles auswählen
#ifndef POSTIT_H
#define POSTIT_H
#include <QGraphicsItem>
#include <QPainter>
#include <QRectF>
#include <QTextItem>
#include <QGraphicsTextItem>
#include "dragdroprect.h"
#include <QCoreApplication>
class PostIt : public QGraphicsItem
{
public:
PostIt(QGraphicsItem* parent = NULL);
DragDropRect *rect;
protected:
void paint(QPainter *painter,
const QStyleOptionGraphicsItem *option,
QWidget *widget);
QRectF boundingR
Code: Alles auswählen
#include "../header/postit.h"
PostIt::PostIt(QGraphicsItem* parent) : QGraphicsItem(parent){
// den Textblock erstellen
setFlag(QGraphicsItem::ItemIsMovable);
QGraphicsTextItem *text = new QGraphicsTextItem(this);
text->setPlainText("Text hier eingeben!");
text->setPos(20,20);
text->setTextInteractionFlags(Qt::TextEditable);
text->setTextWidth(160);
rect = new DragDropRect(this);
rect->setPos(250,0);
}
QRectF PostIt::boundingRect() const{
return QRectF(0,0,400,400);
}
void PostIt::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){
painter->setPen(Qt::black);
painter->setBrush(Qt::yellow);
painter->drawRoundedRect(0,0,400,400,5,5);
painter->drawRoundedRect(0,0,200,100,5,2);
painter->drawImage(0,0,rect->getImage());
}
Dies funktioniert einfach nicht und ich kann nicht verstehen warum dies nicht geht. Über ein bisschenHilfe wäre ich sehr erfreut!
Liebe Grüße
Re: kurze Frage zu QGraphicsItem
Verfasst: 12. August 2015 15:04
von odt
Was funktioniert nicht?
Wird dropEvent aufgerufen?
Ist image gültig? (valid)
Müsstest Du dem PostIt nicht noch zum repainten (via update) veranlassen?
Image initialisieren, um zu testen ob überhaupt...
Re: kurze Frage zu QGraphicsItem
Verfasst: 12. August 2015 15:17
von ReasyEasyPeasy
Also dropEvent wird aufgerufen, da sich die Farbe vom DragDropRect ändert.
Was meinst du mit Image gültig?:) also ich habe ein .jpg Datei in das Kästchen gezogen.
Das mit dem updaten war mir klar, ich wusste nur nicht wie ich aus dem DragDropRect das PostIt update. Wenn ich das PostIt allerdings bewege, nachdem ich ein Foto im DragDropRect gezogen habe, müsste es sich doch automatisch updaten?

Wenn ich nun folgendes mache:
Code: Alles auswählen
QImage DragDropRect::getImage()
{
QImage image1(QString("%1%2").arg(QCoreApplication::applicationDirPath()).arg("/bilder/icon1.png"));
return image1;
}
wird das Bild angezeigt.
Re: kurze Frage zu QGraphicsItem
Verfasst: 12. August 2015 15:33
von odt
> Was meinst du mit Image gültig?:)
versuche im dropEvent am Ende
qDebug() << image.isNull() << image.size();
> wie aus dem DragDropRect das PostIt update.
da QGraphicsItem per se kein QObject ist, kannst Du nicht via signal-slots benachrichtigen.
daher am einfachsten dem DropRect ein Pointer auf PostIt geben und damit update();
PS: Ein Move muss nicht zwingend ein update zur Folge haben.
Re: kurze Frage zu QGraphicsItem
Verfasst: 12. August 2015 15:42
von ReasyEasyPeasy
Also ich habe
true QSize(0, 0)
Wird ausgeworfen.
Wie übergebe ich dem DropRecht einen Pointer auf PostIt? Ich erstelle im DropRect doch gar keine Instanz vom PostIt.
Re: kurze Frage zu QGraphicsItem
Verfasst: 12. August 2015 16:00
von odt
also bekommst Du via Drag&Drop kein gültiges Image.
evt. müsste der setAccepted erst nach dem "getten" kommen.
mimeData hat ein hasImage() -> ist das true?
funktioniert es mit einem png?
In den Examples hat es ein Beispiel für einen allgemeinen Drop-Container. vielleicht kannst Du es mit dem mal probieren...
pointerübergabe analog dem parent, ups, Du hast ja das PostIt bereits als parentItem, also
im dropEvent am ende ein parentItem()->update();
en schöne Abig!
Re: kurze Frage zu QGraphicsItem
Verfasst: 12. August 2015 16:08
von ReasyEasyPeasy
Code: Alles auswählen
qDebug() << image.isNull() << image.size();
qDebug() << event->mimeData()->hasImage();
event->setAccepted(true);
parentItem()->update();
Ahh es könnte sein, dass er mir nur den Pfad zum Bild gibt? Ich nehme ein Bild aus dem explorer.
Re: kurze Frage zu QGraphicsItem
Verfasst: 12. August 2015 17:27
von ReasyEasyPeasy
Ok daran lags. Danke für die Hilfe!!!!