kurze Frage zu QGraphicsItem

Alles rund um die Programmierung mit Qt
Antworten
ReasyEasyPeasy
Beiträge: 18
Registriert: 10. Juli 2015 15:47

kurze Frage zu QGraphicsItem

Beitrag 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 :)
odt
Beiträge: 128
Registriert: 12. August 2010 11:49
Kontaktdaten:

Re: kurze Frage zu QGraphicsItem

Beitrag von odt »

Platziere ein QGraphicsTextItem in Dein PostIt (im PostIt-Konstruktor ein new QGraphicsTextItem( this )), evt. bei Bedarf (click) sichtbar machen.
ODT Informatik GmbH, Reto Tschofenig
ReasyEasyPeasy
Beiträge: 18
Registriert: 10. Juli 2015 15:47

Re: kurze Frage zu QGraphicsItem

Beitrag 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
odt
Beiträge: 128
Registriert: 12. August 2010 11:49
Kontaktdaten:

Re: kurze Frage zu QGraphicsItem

Beitrag 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...
ODT Informatik GmbH, Reto Tschofenig
ReasyEasyPeasy
Beiträge: 18
Registriert: 10. Juli 2015 15:47

Re: kurze Frage zu QGraphicsItem

Beitrag 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.
odt
Beiträge: 128
Registriert: 12. August 2010 11:49
Kontaktdaten:

Re: kurze Frage zu QGraphicsItem

Beitrag 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.
ODT Informatik GmbH, Reto Tschofenig
ReasyEasyPeasy
Beiträge: 18
Registriert: 10. Juli 2015 15:47

Re: kurze Frage zu QGraphicsItem

Beitrag von ReasyEasyPeasy »

Also ich habe

Code: Alles auswählen

qDebug() << image.isNull() << image.size(); 
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.
odt
Beiträge: 128
Registriert: 12. August 2010 11:49
Kontaktdaten:

Re: kurze Frage zu QGraphicsItem

Beitrag 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!
ODT Informatik GmbH, Reto Tschofenig
ReasyEasyPeasy
Beiträge: 18
Registriert: 10. Juli 2015 15:47

Re: kurze Frage zu QGraphicsItem

Beitrag 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.
ReasyEasyPeasy
Beiträge: 18
Registriert: 10. Juli 2015 15:47

Re: kurze Frage zu QGraphicsItem

Beitrag von ReasyEasyPeasy »

Ok daran lags. Danke für die Hilfe!!!!
Antworten