mousePressEvent() überladen

Alles rund um die Programmierung mit Qt
Antworten
deliaophelia
Beiträge: 4
Registriert: 7. Juli 2011 17:50

mousePressEvent() überladen

Beitrag von deliaophelia »

Hallo,

ich brauche mal Hilfe bei einem Problem mit Buttons.
Das centralwidget ist genauso groß ist wie ein erzeugtes Objekt. In dies Objekt werden QLabels per Drag and Drop verschoben. Die Funktion mousePressEvent wurde mit dem Drag and Drop überladen.Nun erkennt aber die Funktion keine Buttons mehr, welche gedrückt werden müssen.

Ich bräuchte etwas Rat wie ich es Schaffe ohne das Objekt zu verkleinern (was nämlich wegen drag and drop Gründen nicht geht) die Buttons klickbar zu machen.

Wäre für einen Rat sehr dankbar
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Ich hab den Zweitpost mal gelöscht ;)

Das Problem lässt sich leicht lösen:
In deiner eigenen Implementierung musst du das mousePressEvent() der Basisklasse aufrufen. Wie man das anstellt sollte dein C++-Grundlagenbuch erklären. In den Qt-Examples stolpert man auch oft genug darüber. (Soll jetzt keine Ratestunde werden, sondern einfach der Anreiz, ein recht einfaches Problem selber zu lösen).
Wenn das in deinem Buch nicht drin steht, ist es das die Zeit nicht wert, die du darin liest.
deliaophelia
Beiträge: 4
Registriert: 7. Juli 2011 17:50

Beitrag von deliaophelia »

irgendwie hab ich das gemacht...oder es war falsch

QWidget::mousePressEvent(event);
hab ich in die funktion mousPressEvent() geschrieben.

kann es sein dass es an der falschen Stelle steht, das Programm stürzt mir ab!


Code: Alles auswählen

void DragAndDrop::mousePressEvent(QMouseEvent *event){
   qDebug()<<"mousePressEvent()";


    //Erstellen von einem Child vom Stein
    child = static_cast<QLabel*>(childAt(event->pos()));
     int x1=(event->x()-35)/76;
     int y1;
     int feld_nr;
    if(event->y()<310){


       y1=(event->y()-56)/76;
       feld_nr= x1+(y1*8);

    }else{
       y1=(event->y()-310)/76;
       feld_nr= x1+(y1*6);

    }


    if (!child || child->pixmap()==0){
     qDebug()<<"return";
     QWidget::mousePressEvent(event);

   }


    QPixmap pixmap = *child->pixmap();
    //qDebug() << pixmap.width() << " x " << pixmap.height();
    QByteArray itemData;
    QDataStream dataStream(&itemData, QIODevice::WriteOnly);
    dataStream << pixmap << QPoint(event->pos() - child->pos())<<feld_nr;

    QMimeData *mimeData = new QMimeData;
    mimeData->setData("application/x-qt-image",itemData);

    QDrag *drag = new QDrag(this);
    drag->setMimeData(mimeData);
    drag->setPixmap(pixmap);
    drag->setHotSpot(event->pos() - child->pos());

    QPixmap tempPixmap = pixmap;
    QPainter painter;
    painter.begin(&tempPixmap);
    painter.fillRect(pixmap.rect(), QColor(180, 200, 255, 192));//füllt Rechteck mit graublau
    painter.end();

    child->setPixmap(tempPixmap);

    if (!(drag->exec(Qt::CopyAction | Qt::MoveAction, Qt::CopyAction) == Qt::MoveAction)){
      child->show();
      child->setPixmap(pixmap);
    }


}
// edit franzf:
CODE-Tags engefügt - bitte in Zukunft selber, danke :)
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Denk nach über diese Zeile:

Code: Alles auswählen

if (!child || child->pixmap()==0)
Außerdem:
* findest du einen besseren cast als static_cast an dieser Stelle?
* Warum immer new? Verwende doch automatische Objekte (="Stack")
deliaophelia
Beiträge: 4
Registriert: 7. Juli 2011 17:50

Beitrag von deliaophelia »

aber wie hilft mir das weiter bei meinem Problem?

gut das mit dem !child kann raus...aber der Rest, hat der Auswirkungen darauf, dass mein Überladen nicht funktioniert?


entferne ich aus der Abrage

Code: Alles auswählen

if(!child || child->pixmap()==0)


eine Bedingung stürzt das Programm ebenfalls ab, jedoch erst wenn ich im Programm mit der Maus klicke
ScyllaIllciz
Beiträge: 200
Registriert: 9. Juli 2010 19:31

Beitrag von ScyllaIllciz »

Wie wäre es mit einem Debugger? Schritt für Schritt durch die Funktion zu gehen dürfte doch nicht so schwer sein? Und wenn Dein Debugger "kaputt" sein sollte, dann eben nach jeder Zeile eine qDebug Ausgabe und schon siehste bis zu welcher Zeile Du kommst.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

deliaophelia hat geschrieben:entferne ich aus der Abrage

Code: Alles auswählen

if(!child || child->pixmap()==0)


eine Bedingung stürzt das Programm ebenfalls ab, jedoch erst wenn ich im Programm mit der Maus klicke
Problem: Die Abfrage "!child" setzt voraus, dass tatsächlich child NULL ist, auch wenn ein Widget darunter ist. childAt() liefert ja erstmal nur ein QWidget zurück, da hast du gut erkannt "ich will aber nur QLabels" - deshalb castest du. Nur - static_cast ist der falsche cast! Du willst einen dynamic_cast, der liefert tatsächlich NULL, wenn der cast nicht funktioniert (bei Zeigern - dynamic_cast mit Referenzen wirft eine Exception). Es gibt von Qt eine speziell auf QObject-Ableitungen optimierte Version, qobject_cast.

Soll heißen: Das static_cast liefert dir irgendwas zurück, egal ob richtig oder nicht - nicht verlässlich!

Desweiteren denke ich, du wolltest tatsächlich fragen:

Code: Alles auswählen

if (child && !child->pixmap())
Kann das sein?

Desweiteren: in dem if-Zweig schreibst du "return" auf die Konsole, verlässt aber die Funktion nicht. Danach greifst du munter auf child->pixmap() zu, ohne dich vorher abzusichern!
Antworten